Google login obtenir un jeton d'accès avec de nouveaux GoogleSignInOptions
Mon application android utilise actuellement le GoogleAuthUtil à signin utilisateurs et extraction d'une access_token
qui est passé à l'arrière-plan (extraits de code ci-dessous qui montrent la création de la GoogleApiClient et à l'aide 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é à l'arrière-plan
Je suis maintenant essayer de passer à la nouvelle version de Google SignIn - https://developers.google.com/identity/sign-in/android/sign-in
et donc changé le GoogleApiClient création 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 de faire la connexion utiliser,
startActivityForResult(Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient), RC_GET_TOKEN);
et sur l'activité résultat de l'utilisation (similaire à l'exemple donné dans le 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
de retour avec
result.getSignInAccount().getIdToken();
Personne ne sait si il est possible d'obtenir un jeton d'accès (comme précédemment) et si oui, comment? Toute aide appréciée.
Pas vraiment. Eu à mettre en œuvre id de jeton de manutention dans le backend avant que je puisse commencer à l'aide de ce.
J'ai fini par utiliser Android de sélection de compte pour obtenir le nom du compte et le GoogleAuthUtil.getToken(Contexte, accoutName, champ d'application) pour récupérer le jeton lui-même, il a travaillé comme un charme et beaucoup plus simple ensuite la première approuch.
J'ai envisagé de le faire moi-même au départ, mais ensuite réalisé qu'il y avait beaucoup moins de code d'erreur et de chemins d'accès dans l'application à traiter (liés à l'utilisation de la GoogleApiClient
connect()
etc.) si j'ai juste ajouté idToken l'analyse en arrière-plan.
OriginalL'auteur Bootstrapper | 2015-11-21
Vous devez vous connecter pour publier un commentaire.
Après la signature, vous serez en mesure d'obtenir le jeton:
n'oubliez pas de faire un Asynctask. pour plus de détails, jetez un oeil à ici
EDIT:
Noter que, malgré le nom de la méthode:
il ne vous donne pas un Jeton OAuth, il renvoie plutôt à une "courte durée code d'autorisation" selon l' la documentation.
Vous devez transmettre le Code d'Autorisation à votre serveur d'arrière-plan via le protocole HTTPS. Seulement à partir de votre serveur, vous devriez essayer de recevoir un Accès et/ou à l'Actualisation de jeton, pas dans votre application.
travaille encore ici
cette méthode est obsolète
OriginalL'auteur abedfar
Si j'ai eu le même problème. ils ont changé maintenant si le jeton est dans
Pour obtenir un accès trop ce jeton vous avez trop demander dans
La
R.string.server_client_ID
est leclient ID
à partir du projet que vous faites dans votre Google developer Console.J'espère que cela vous aide.
ici est aussi la documentation que j'ai suivi. https://developers.google.com/identity/sign-in/android/backend-auth
id_token
et pas unaccess_token
. Donc pour l'instant il semble que nous ayons encore besoin de récupérer lesaccess_token
la même façon que précédemment avec laGoogleAuthUtil.getToken()
dans une AsyncTask (j'étais un peu en espérant que il y aurait une autre façon, mais quand même...)C'est correct. id_token doivent être échangés pour de l'access_token.
Veuillez me corriger, mais il semble que id_token ne peuvent pas être échangés à access_token. id_token contient les infos de l'utilisateur codées à l'intérieur du jeton de lui-même. Si vous souhaitez obtenir access_token, vous avez besoin de demander pour le serveur d'Auth code (
getServerAuthCode
). C'est malheureux, parce que quand vous demande de serveur Auth code, Google notifier l'utilisateur que l'application demande de "Travailler Hors connexion".OriginalL'auteur pjapple15