web-dev-qa-db-ja.com

Firebase認証を使用して認証された後、Googleアクセストークンを取得する

Google Access Tokenを取得して、Google RESTなどのAPI YouTube Data API などの認証済みユーザーから(Firebase Authenticationを使用)にアクセスしようとしています。

Firebase-UI for Android-Auth library。]の助けを借りて、アプリにGoogleサインインを正常に統合しました。FirebaseUser.getToken()から取得したトークンmethodはREST APIの有効なGoogleアクセストークンではありません。

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

Web用Googleサインインガイド では、var token = result.credential.accessToken;を呼び出すことでアクセストークンを取得できますが、Androidで同様の方法を見つけることができません。

入力はありますか?十分な情報を提供していない場合は、ここにコメントしてください。ありがとうございました :)

32
Wilik

GoogleAuthUtil.getToken を試してください scope は「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

私は@vovkasソリューションをフォローしていますが、最後のアップデート_11.6.0_を使用すると、Accountをより簡単に取得できるため、すべてをhandy dandyAsyncTaskはいつでも再利用できます:

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

キーはGoogleSignIn.getLastSignedInAccount(context)を使用することです。

6
cutiko