web-dev-qa-db-de.com

Rufen Sie das Google Access-Token nach der Authentifizierung mithilfe der Firebase-Authentifizierung ab

Ich versuche, Google Access Token abzurufen, um auf die Google REST API wie YouTube Data API von einem authentifizierten Benutzer (mithilfe der Firebase-Authentifizierung) zuzugreifen.

Ich habe Google Sign-In mit Hilfe von Firebase-UI für Android - Auth library erfolgreich in meine App integriert. Das von FirebaseUser.getToken() abgerufene Token Methode ist kein gültiges Google Access-Token für REST API.

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

In Google Sign-In für Webguide ist es möglich, das Zugriffstoken durch Aufrufen von var token = result.credential.accessToken; Abzurufen, aber ich kann die ähnliche Methode in Android nicht finden.

Irgendwelche Eingaben? Bitte kommentieren Sie hier, wenn ich nicht genügend Informationen zur Verfügung stelle. Vielen Dank :)

32
Wilik

Versuchen Sie GoogleAuthUtil.getToken wobei scope wie "oauth2: scope1 scope2 scope3" ist.

@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

Ich verfolge die @ vovkas-Lösung und möchte Sie darüber informieren, dass Sie mit dem letzten Update 11.6.0 Das benötigte Account leichter bekommen, sodass Sie alles in einem haben können handy dandyAsyncTask zur Wiederverwendung, wann immer Sie wollen:

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;
    }
}

Der Schlüssel ist, GoogleSignIn.getLastSignedInAccount(context) zu verwenden.

6
cutiko