如何使用Google Provider在Firebase上重新认证用户?

26

Firebase中使用reauthenticate()的示例仅展示了如何重新验证使用电子邮件和密码登录的用户:

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

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

问题在于Google API中没有相应的方法来获取当前Access Token并最终获取AuthCredential。那么在这种情况下我应该传递什么给getCredential()?

3个回答

9

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

1
四年后我又遇到了同样的问题,看起来这个方法可行。所以我选择它作为答案!谢谢! - Alaa M.
问题在于令牌在1小时后过期。我认为在Android中没有办法获取刷新令牌并使用它重新验证用户。 - user3421469

0

您可以通过两种方式进行身份验证,以获取GoogleSignInResult

i) 通过在 Google 登录屏幕中输入电子邮件 ID 和密码。

ii) 通过从手机中已登录的帐户中选择帐户。

我已使用第二种方法来获取访问令牌并验证用户。

有关更多支持参考链接,请参见以下链接。

Google 登录链接 1

Stackoverflow - 令牌刷新

Google 认证提供程序文档

服务器端令牌验证文档

如果您的唯一目标是获取令牌,因此您也可以尝试此 GitHub 源

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

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

我不记得我最终做了什么(已经是4个月前的事情),但我认为我需要一些静态的东西,可以随时使用,而不仅仅是在登录时(例如,如果用户想要删除他们的帐户)。无论如何,因为我不再从事这项工作,如果有人认为这是正确的答案,我会选择它作为答案。 - Alaa M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接