Google login get access-token mit neuen GoogleSignInOptions
Meine android-app nutzt derzeit die GoogleAuthUtil zu signin Benutzer und Holen sich ein access_token
zur übergabe an das backend (code-Schnipsel unten die Karte erstellen die GoogleApiClient und mit GoogleAuthUtil, um die token).
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");
welche ich dann an das backend gesendet
Ich versuche jetzt zu bewegen, um die neue Google-SignIn - https://developers.google.com/identity/sign-in/android/sign-in
und so änderte sich die GoogleApiClient Schöpfung wie,
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();
und dann kommen die login verwenden,
startActivityForResult(Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient), RC_GET_TOKEN);
und Tätigkeit Ergebnis verwenden (ähnlich dem Beispiel in dem link oben),
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);
}
});
}
aber jetzt scheint es, dass in handleSingInResult(GoogleSignInResult result)
ich kann nur ein id token
wieder mit
result.getSignInAccount().getIdToken();
Weiß jemand, ob es möglich ist, um ein access token aus dieser (wie vorher) und wenn ja, wie? Jede Hilfe zu schätzen.
- Ich habe das gleiche Problem hier, haben Sie es geschafft, arbeiten Sie Ihren Weg, um dieses Problem?
- Nicht wirklich. Umzusetzen hatte-id-token-handling im backend, bevor ich anfangen konnte mit dieser.
- Ich landete mit den Android-account-picker, um die account-Namen, und die GoogleAuthUtil.getToken(Kontext, accoutName, Umfang) für den Abruf des Tokens selbst, es funktionierte wie ein Charme und sehr viel einfacher dann die ersten approuch.
- Als ich tun, dass ich mich zuerst, aber dann erkannte, dass es viel weniger code und error-Pfade in der app zu beschäftigen (in Bezug auf die Verwendung der GoogleApiClient
connect()
etc.) wenn ich nur Hinzugefügt idToken analysieren, um das backend.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach der Anmeldung werden Sie in der Lage, um die token:
vergessen Sie nicht, es zu tun einen Asynctask. für weitere Details haben Sie einen Blick auf hier
EDIT:
Beachten Sie, dass, trotz der Methode name:
es nicht geben Sie ein OAuth-Token ab, sondern gibt eine "kurzlebige Autorisierungs-code" nach dem Dokumentation.
Sollten Sie die übertragung der Autorisierungs-Code, der auf Ihrem backend-server über HTTPS. Nur von deinem server solltest du versuchen, erhalten Sie Zugang und/oder Refresh-token, die nicht in Ihrem app.
Also ich hatte das gleiche problem. Sie haben es jetzt geändert, so dass das token kommt durch die in
Zugang zu dieser token, die Sie haben zu Fragen, für die es in
Den
R.string.server_client_ID
ist dieclient ID
aus dem Projekt, die Sie in Ihrer Google developer Console.Ich hoffe das hilft dir.
hier ist auch die Dokumentation, die ich folgte. https://developers.google.com/identity/sign-in/android/backend-auth
id_token
und nicht einaccess_token
. So für jetzt, wie es aussieht, müssen wir noch Holenaccess_token
die gleiche Weise wie zuvor mit derGoogleAuthUtil.getToken()
in einen AsyncTask (ich hatte irgendwie gehofft es gäbe einen anderen Weg, aber trotzdem...)getServerAuthCode
). Dies ist bedauerlich, denn wenn Sie Anfrage für server Auth-code, Google benachrichtigt den Benutzer, dass die app-Anforderung "Offline Arbeiten".