首页 文章

如何使用Google提供程序在Firebase上重新验证用户?

提问于
浏览
19

The example在Firebase中使用 reauthenticate() 仅显示如何重新验证使用 Email and Password 签名的用户:

AuthCredential credential = EmailAuthProvider.getCredential("user@example.com", "password1234");
FirebaseAuth.getInstance().getCurrentUser().reauthenticate(credential);

我也知道如何使用Facebook提供商重新进行身份验证( credential = FacebookAuthProvider.getCredential(AccessToken.getCurrentAccessToken().toString()) ) .

问题是Google API中没有等效方法来获取当前的访问令牌并最终获得 AuthCredential . 那么在这种情况下我应该传递给 getCredential()

3 回答

  • 0

    我知道这是一个老问题,但我没有找到完整的答案 . 这是在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.");
                }
            }
         });
    }
    
  • 0

    考虑到您将收到 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>() {...
    
  • 2

    您可以通过2种方式获得 GoogleSignInResult 进行身份验证 .

    i)通过在谷歌登录界面输入电子邮件ID和密码 .

    ii)从电话中已登录的帐户中选择帐户 .

    我使用第二种方法获取访问令牌并验证用户身份 .

    更多支持参考链接如下 .

    google sign in link 1

    Stackoverflow - token refresh

    google auth provider documentation

    server side token verification docs

    如果您唯一的目标是获得令牌,那么您也可以尝试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();
    

相关问题