【问题标题】:How to re-authenticate a user on Firebase with Google Provider?如何使用 Google Provider 重新验证 Firebase 上的用户?
【发布时间】:2017-04-15 09:37:43
【问题描述】:

The example 在 Firebase 中使用 reauthenticate() 仅显示如何重新验证使用 电子邮件和密码 签名的用户:

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

我也知道如何通过 Facebook Provider (credential = FacebookAuthProvider.getCredential(AccessToken.getCurrentAccessToken().toString())) 重新进行身份验证。

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

【问题讨论】:

    标签: android firebase firebase-authentication google-signin


    【解决方案1】:

    我知道这是个老问题,但我没有找到完整的答案。这是在 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 年后我又回到了同样的问题,看起来这很有效。所以我选择它作为答案!谢谢!
    • 问题是令牌在 1 小时后过期。我认为 Android 中没有办法获取刷新令牌并使用它重新验证用户。
    【解决方案2】:

    考虑到您会收到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 个月前),但我想我需要一些静态的东西,我可以随时使用,而不仅仅是在登录时使用(例如,如果用户想删除他们的帐户)。无论如何,因为我不再研究这个了,如果有人认为这是正确的答案,我会选择它作为答案。
    【解决方案3】:

    您可以通过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();
    

    【讨论】:

      猜你喜欢
      • 2019-02-14
      • 1970-01-01
      • 2020-10-13
      • 2017-02-24
      • 2020-07-15
      • 1970-01-01
      • 2021-06-16
      • 1970-01-01
      • 2018-03-28
      相关资源
      最近更新 更多