web-dev-qa-db-fra.com

Récupérer le jeton Google Access après authentification à l'aide de l'authentification Firebase

J'essaie de récupérer le jeton d'accès Google pour accéder à Google REST telle que API de données YouTube d'un utilisateur authentifié (à l'aide de l'authentification Firebase).

J'ai intégré avec succès Google Sign-In dans mon application à l'aide de la bibliothèque Firebase-UI pour Android - Auth . -.). Le jeton extrait de FirebaseUser.getToken() Cette méthode n'est pas un jeton d'accès Google valide pour l'API REST.

user.getToken(true).addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
    public void onComplete(@NonNull Task<GetTokenResult> task) {
        if (task.isSuccessful()) {
            String token = task.getResult().getToken();
            // 'token' is not a Google Access Token
        }
    }
});

Dans guide de connexion Google pour le Web , il est possible d'obtenir le jeton d'accès en appelant var token = result.credential.accessToken;, mais je ne trouve pas la même méthode sous Android.

Des entrées? Veuillez commenter ici si je ne fournis pas assez d'informations. Je vous remercie :)

32
Wilik

Essayez GoogleAuthUtil.getTokenscope ressemble à "oauth2: scope1 scope2 scope3"

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .build();

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this, this)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build();
}

private void signIn() {
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
    startActivityForResult(signInIntent, RC_SIGN_IN);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RC_SIGN_IN) {
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        if (result.isSuccess()) {
            final GoogleSignInAccount account = result.getSignInAccount();

                Runnable runnable = new Runnable() {
                    @Override
                    public void run() {
                        try {
                            String scope = "oauth2:"+Scopes.EMAIL+" "+ Scopes.PROFILE;
                            String accessToken = GoogleAuthUtil.getToken(getApplicationContext(), account.getAccount(), scope, new Bundle());
                            Log.d(TAG, "accessToken:"+accessToken); //accessToken:ya29.Gl...

                        } catch (IOException e) {
                            e.printStackTrace();
                        } catch (GoogleAuthException e) {
                            e.printStackTrace();
                        }
                    }
                };
                AsyncTask.execute(runnable);

        } else {
        }
    }
}
27
vovkas

Je suis la solution @vovkas et je tiens à vous informer que, avec la dernière mise à jour 11.6.0, Vous pouvez obtenir le Account nécessaire plus facilement, de sorte que vous puissiez tout avoir dans un handy dandyAsyncTask à réutiliser à tout moment:

public class GetToken extends AsyncTask<Void, Void, String> {

    private final Context context;

    public GetToken(Context context) {
        this.context = context;
    }

    @Override
    protected String doInBackground(Void... voids) {
        try {
            String scope = "oauth2:" + Scopes.EMAIL + " " + Scopes.PROFILE;
            GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(context);
            return GoogleAuthUtil.getToken(context, account.getAccount(), scope, new Bundle());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (GoogleAuthException e) {
            e.printStackTrace();
        }
        return null;
    }
}

La clé est d'utiliser GoogleSignIn.getLastSignedInAccount(context).

6
cutiko