it-swarm.com.de

Google-Login erhalten Zugriffstoken mit neuen GoogleSignInOptions

Meine Android-App verwendet derzeit GoogleAuthUtil, um Benutzer anzumelden und einen access_token abzurufen, der an das Backend übergeben wird.

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");

was ich dann an das backend geschickt habe

Ich versuche jetzt, auf das neue Google SignIn zu wechseln - https://developers.google.com/identity/sign-in/Android/sign-in

und so änderte sich die GoogleApiClient-Erstellung wie folgt:

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 für die Anmeldung verwenden,

startActivityForResult(Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient), RC_GET_TOKEN);

und bei Verwendung des Aktivitätsergebnisses (ähnlich wie im obigen Link),

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 ich in handleSingInResult(GoogleSignInResult result) nur einen id token mit result.getSignInAccount().getIdToken(); zurückbekommen kann

Weiß jemand, ob es möglich ist, ein Zugriffstoken von diesem zu erhalten (wie zuvor) und wenn ja, wie? Jede Hilfe dankbar.

8
Bootstrapper

Nach der Anmeldung können Sie das Token erhalten:

final String token = GoogleAuthUtil.getToken(mAppContext, mAccountName, AUTH_TOKEN_TYPE);

vergiss nicht, es als Asynctask zu machen. Für mehr Details schauen Sie hier

BEARBEITEN:

Beachten Sie, dass trotz des Methodennamens:

GoogleAuthUtil.getToken()

es wird kein OAuth-Token ausgegeben, sondern ein "kurzlebiger Autorisierungscode" gemäß der Dokumentation zurückgegeben.

Was soll ich tun, nachdem ich den Autorisierungscode durch Aufrufen von GoogleAuthUtil.getToken () erhalten habe?

Sie sollten den Autorisierungscode über HTTPS an Ihren Back-End-Server senden. Nur von Ihrem Server sollten Sie versuchen, Zugriffs- und/oder Aktualisierungstoken zu erhalten, nicht in Ihrer App.

5
abedfar

Also hatte ich das gleiche Problem. Sie haben es jetzt geändert, damit der Token hereinkommt

GoogleSignInAccount acct = result.getSignInAccount();
Log.d(TAG, "handleSignInResult2: "+acct.getIdToken());

Um Zugriff auf dieses Token zu erhalten, müssen Sie es auch in anfordern

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail().requestProfile().requestId().requestIdToken(getString(R.string.server_client_ID))
                    .build();

Der R.string.server_client_ID ist der client ID aus dem Projekt, das Sie in Ihrer Google-Entwicklerkonsole erstellt haben.

Ich hoffe das hilft dir.

hier ist auch die Dokumentation, die ich befolgt habe. https://developers.google.com/identity/sign-in/Android/backend-auth

2
pjapple15