web-dev-qa-db-ja.com

Googleプロバイダーを使用してFirebaseでユーザーを再認証するにはどうすればよいですか?

Firebaseでreauthenticate()を使用する場合は、メールとパスワードで署名したユーザーを再認証する方法のみを示します

_AuthCredential credential = EmailAuthProvider.getCredential("[email protected]", "password1234");
FirebaseAuth.getInstance().getCurrentUser().reauthenticate(credential);
_

Facebookプロバイダー(credential = FacebookAuthProvider.getCredential(AccessToken.getCurrentAccessToken().toString()))で再認証する方法も知っています。

問題は、Google APIに現在のアクセストークンを取得し、最終的にAuthCredentialを取得する同等のメソッドがないことです。この場合、getCredential()に何を渡しますか?

22
Alaa M.

私はこれが古い質問であることを知っていますが、これに対する完全な答えは見つかりませんでした。これは、Androidでそれを行う方法です。

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
// Get the account
GoogleSignInAccount acct = GoogleSignIn.getLastSignedInAccount(context);
if (acct != null) {
     AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
     user.reauthenticate(credential).addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            if (task.isSuccessful()) {
                Log.d(TAG, "Reauthenticated.");
            }
        }
     });
} 
4
kivmii

サインインへの応答としてGoogleSignInResultを受け取ったことを考えると、次のコードを使用できると思います。

// assuming result variable has GoogleSignInResult
// GoogleSignInResult result 

// Get the account
GoogleSignInAccount acct = result.getSignInAccount();

// credential
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
FirebaseAuth.getInstance().getCurrentUser().reauthenticate(credential).addOnCompleteListener(new OnCompleteListener<Void>() {...
0
manishg

認証には2つの方法でGoogleSignInResultを取得できます。

i)Googleのログイン画面にメールIDとパスワードを入力する。

ii)電話ですでにログインしているアカウントからアカウントを選択する。

私は2番目のアプローチを使用してアクセストークンを取得し、ユーザーを認証しました。

その他のサポート参照については、リンクを以下に示します。

リンク1のGoogleサインイン

Stackoverflow-トークンの更新

Google認証プロバイダーのドキュメント

サーバー側トークン検証ドキュメント

唯一の目的がトークンを取得するための場合は、 this github source を試すこともできます。

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
    .requestEmail()
    .build();

//サインインオプションを使用してAPIクライアントインスタンスをビルドします。

mGoogleApiClient = new GoogleApiClient.Builder(this)
    .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
    .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
    .build();
private void signIn() {
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent,RC_SIGN_IN); }

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Result returned from launching the Intent from    GoogleSignInApi.getSignInIntent(...);
if (requestCode == RC_SIGN_IN){
    GoogleSignInResult result =Auth.GoogleSignInApi.getSignInResultFromIntent(data);
    handleSignInResult(result);
    }


private void handleSignInResult(GoogleSignInResult result) {
Log.d(TAG, "handleSignInResult:" + result.isSuccess());
if (result.isSuccess()) {
    // Signed in successfully, show authenticated UI.
    GoogleSignInAccount acct = result.getSignInAccount();


} else {
    // Signed out, show unauthenticated.

       }
}

//認証を受ける

AuthCredential credential =
GoogleAuthProvider.getCredential(acct.getIdToken(), null);
FirebaseAuth.getInstance().getCurrentUser().reauthenticate(credential)
.addOnCompleteListener(new OnCompleteListener<Void>() {
// add your job here on authenticated
} 
// if token is obsoleted then you can do this
credential.refreshToken();
accessToken = credential.getAccessToken();
0