J'essaie de récupérer le jeton d'accès Google pour accéder à Google REST telle que API de données YouTube d'un utilisateur authentifié (à l'aide de l'authentification Firebase).
J'ai intégré avec succès Google Sign-In dans mon application à l'aide de la bibliothèque Firebase-UI pour Android - Auth . -.). Le jeton extrait de FirebaseUser.getToken()
Cette méthode n'est pas un jeton d'accès Google valide pour l'API REST.
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
}
}
});
Dans guide de connexion Google pour le Web , il est possible d'obtenir le jeton d'accès en appelant var token = result.credential.accessToken;
, mais je ne trouve pas la même méthode sous Android.
Des entrées? Veuillez commenter ici si je ne fournis pas assez d'informations. Je vous remercie :)
Essayez GoogleAuthUtil.getToken où scope ressemble à "oauth2: scope1 scope2 scope3"
@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 {
}
}
}
Je suis la solution @vovkas et je tiens à vous informer que, avec la dernière mise à jour 11.6.0
, Vous pouvez obtenir le Account
nécessaire plus facilement, de sorte que vous puissiez tout avoir dans un handy dandyAsyncTask
à réutiliser à tout moment:
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;
}
}
La clé est d'utiliser GoogleSignIn.getLastSignedInAccount(context)
.