Ich versuche, Google Access Token abzurufen, um auf die Google REST API wie YouTube Data API von einem authentifizierten Benutzer (mithilfe der Firebase-Authentifizierung) zuzugreifen.
Ich habe Google Sign-In mit Hilfe von Firebase-UI für Android - Auth library erfolgreich in meine App integriert. Das von FirebaseUser.getToken()
abgerufene Token Methode ist kein gültiges Google Access-Token für REST API.
user.getToken(true).addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
public void onComplete(@NonNull Task<GetTokenResult> task) {
if (task.isSuccessful()) {
String token = task.getResult().getToken();
// 'token' is not a Google Access Token
}
}
});
In Google Sign-In für Webguide ist es möglich, das Zugriffstoken durch Aufrufen von var token = result.credential.accessToken;
Abzurufen, aber ich kann die ähnliche Methode in Android nicht finden.
Irgendwelche Eingaben? Bitte kommentieren Sie hier, wenn ich nicht genügend Informationen zur Verfügung stelle. Vielen Dank :)
Versuchen Sie GoogleAuthUtil.getToken wobei scope wie "oauth2: scope1 scope2 scope3" ist.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
}
private void signIn() {
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, RC_SIGN_IN);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
final GoogleSignInAccount account = result.getSignInAccount();
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
String scope = "oauth2:"+Scopes.EMAIL+" "+ Scopes.PROFILE;
String accessToken = GoogleAuthUtil.getToken(getApplicationContext(), account.getAccount(), scope, new Bundle());
Log.d(TAG, "accessToken:"+accessToken); //accessToken:ya29.Gl...
} catch (IOException e) {
e.printStackTrace();
} catch (GoogleAuthException e) {
e.printStackTrace();
}
}
};
AsyncTask.execute(runnable);
} else {
}
}
}
Ich verfolge die @ vovkas-Lösung und möchte Sie darüber informieren, dass Sie mit dem letzten Update 11.6.0
Das benötigte Account
leichter bekommen, sodass Sie alles in einem haben können handy dandyAsyncTask
zur Wiederverwendung, wann immer Sie wollen:
public class GetToken extends AsyncTask<Void, Void, String> {
private final Context context;
public GetToken(Context context) {
this.context = context;
}
@Override
protected String doInBackground(Void... voids) {
try {
String scope = "oauth2:" + Scopes.EMAIL + " " + Scopes.PROFILE;
GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(context);
return GoogleAuthUtil.getToken(context, account.getAccount(), scope, new Bundle());
} catch (IOException e) {
e.printStackTrace();
} catch (GoogleAuthException e) {
e.printStackTrace();
}
return null;
}
}
Der Schlüssel ist, GoogleSignIn.getLastSignedInAccount(context)
zu verwenden.