web-dev-qa-db-fra.com

Mot de passe d'accès à la connexion Google avec les nouvelles options GoogleSignInOptions

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.

8
Bootstrapper

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.

5
abedfar

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

2
pjapple15