Mon application Android utilise actuellement GoogleAuthUtil pour connecter les utilisateurs et récupérer un access_token
qui est transmis au backend (extraits de code ci-dessous illustrant la création de GoogleApiClient et l'utilisation de GoogleAuthUtil pour obtenir le jeton).
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(Plus.API)
.addScope(new Scope("profile"))
.build();
...
...
String accessToken = GoogleAuthUtil.getToken(GoogleLoginActivity.this,
Plus.AccountApi.getAccountName(mGoogleApiClient),
"oauth2:profile email");
que j'ai ensuite envoyé au backend
J'essaie maintenant de passer à la nouvelle page de connexion Google - https://developers.google.com/identity/sign-in/Android/sign-in
et ainsi changé la création de GoogleApiClient comme,
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.requestIdToken("<web client id>")
.build();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
et ensuite faire l'utilisation de la connexion,
startActivityForResult(Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient), RC_GET_TOKEN);
et sur l'utilisation des résultats d'activité (similaire à l'exemple du lien ci-dessus),
OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient);
if (opr.isDone()) {
// If the user's cached credentials are valid, the OptionalPendingResult will be "done"
// and the GoogleSignInResult will be available instantly.
Log.d(TAG, "Got cached sign-in");
handleSignInResult(opr.get());
} else {
// If the user has not previously signed in on this device or the sign-in has expired,
// this asynchronous branch will attempt to sign in the user silently. Cross-device
// single sign-on will occur in this branch.
showProgress();
opr.setResultCallback(new ResultCallback<GoogleSignInResult>() {
@Override
public void onResult(GoogleSignInResult googleSignInResult) {
hideProgress();
handleSignInResult(googleSignInResult);
}
});
}
mais maintenant il semble que dans handleSingInResult(GoogleSignInResult result)
je ne peux obtenir un id token
avec result.getSignInAccount().getIdToken();
Est-ce que quelqu'un sait s'il est possible d'obtenir un jeton d'accès à partir de cela (comme précédemment) et si oui comment? Toute aide appréciée.
Après vous être connecté, vous pourrez obtenir le jeton:
final String token = GoogleAuthUtil.getToken(mAppContext, mAccountName, AUTH_TOKEN_TYPE);
n'oubliez pas de faire un Asynctask. pour plus de détails, regardez ici
EDIT:
Notez que, malgré le nom de la méthode:
GoogleAuthUtil.getToken()
il ne vous donne pas un jeton OAuth, il renvoie plutôt un "code d'autorisation de courte durée" selon la documentation .
Que dois-je faire après avoir obtenu le code d'autorisation en appelant GoogleAuthUtil.getToken ()?
Vous devez transmettre le code d'autorisation à votre serveur principal via HTTPS. Seulement depuis votre serveur, vous devriez essayer de recevoir un jeton d'accès et/ou de rafraîchissement, et non dans votre application.
Donc, j'avais le même problème. ils ont changé maintenant si le jeton passe dans
GoogleSignInAccount acct = result.getSignInAccount();
Log.d(TAG, "handleSignInResult2: "+acct.getIdToken());
Pour avoir également accès à ce jeton, vous devez également le demander dans
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail().requestProfile().requestId().requestIdToken(getString(R.string.server_client_ID))
.build();
Le R.string.server_client_ID
est le client ID
du projet que vous avez créé dans votre console de développeur Google.
J'espère que ceci vous aide.
voici aussi la documentation que j'ai suivie. https://developers.google.com/identity/sign-in/Android/backend-auth