【问题标题】:How to create "credential" object needed by Firebase web user.reauthenticateWithCredential() method?如何创建 Firebase web user.reauthenticateWithCredential() 方法所需的“凭据”对象?
【发布时间】:2016-10-15 03:59:56
【问题描述】:

new docs 中的(不清楚的)示例:

var user = firebase.auth().currentUser;
var credential;
// Prompt the user to re-provide their sign-in credentials
user.reauthenticateWithCredential(credential).then(function() {

我应该如何创建这个credential 对象?

我试过了:

  • reauthenticateWithCredential(email, password)(如登录方式)
  • reauthenticateWithCredential({ email, password })(文档只提到一个论点)

运气不好:(

PS:我没有计算在新文档中搜索相关信息所浪费的时间......我非常想念精彩的 firebase.com 文档,但想切换到 v3 或更高版本的 firebase.storage ...

【问题讨论】:

    标签: javascript firebase firebase-authentication


    【解决方案1】:

    我设法使它工作,应该更新文档以包含此内容,以便那些不想在详尽但难以阅读的 API 参考中花费太多时间。

    凭证对象是这样创建的:

    const user = firebase.auth().currentUser;
    const credential = firebase.auth.EmailAuthProvider.credential(
        user.email, 
        userProvidedPassword
    );
    // Now you can use that to reauthenticate
    user.reauthenticateWithCredential(credential);
    

    有人问userProvidedPassword,它是否是第一次登录时的某种存储变量。不是,您应该打开一个输入密码的新对话框/页面,用户将再次输入他们的密码

    我坚持认为您不得尝试通过以明文形式存储用户密码来解决此问题。这是应用程序的正常功能。例如,在 GMail 中,有时您的会话过期,或者怀疑被黑客入侵,您更改了位置等。GMail 会再次要求您输入密码。这是重新认证。

    这种情况不会经常发生,但使用 Firebase 的应用应该支持它,否则用户会在某个时候卡住。

    【讨论】:

    • 很高兴听到您找到了解决方案!我将添加一条注释以更新/澄清文档。请记住,每个页面上还有一个用于特定目的的反馈按钮。 :-)
    • 3 年后,文档仍然需要更新!谢谢你为我节省了时间。
    • 4 年后......但文档仍然“详尽但难以阅读”
    • @Oliver,此代码与用户何时需要重新进行身份验证有关(因此是方法的名称)。在这种情况下,与登录表单一样,他们需要再次提供密码。切勿自己存储用户密码。 (或者,好吧,正确地做,但在这种情况下你没有使用 Firebase auth :))
    • @FotiosTsakiris 您绝对不应该尝试通过以明文形式存储用户密码来解决它,这似乎是应用程序的正常功能。例如,在 GMail 中,有时您的会话过期,或者怀疑被黑客入侵,您更改了位置等。GMail 会再次要求您输入密码。这是重新认证。它不会经常发生,但使用 Firebase 的应用程序应该支持它,否则用户会在某个时候卡住。为了清楚起见,将此添加到答案中。
    【解决方案2】:

    完整答案 - 您可以使用以下内容:

    var user = firebase.auth().currentUser;
    var credentials = firebase.auth.EmailAuthProvider.credential(
      user.email,
      'yourpassword'
    );
    user.reauthenticateWithCredential(credentials);
    

    请注意reauthenticateWithCredentialreauthenticate()的更新版本

    【讨论】:

    • 感谢您添加已接受答案中缺少的第三行
    • @Oliver 密码应该是该电子邮件中已经存在的密码。
    • 不确定是@Sandokan,在这里看到:firebase.google.com/docs/reference/js/… - 你在哪里看到它被弃用了?
    • @Sandokan 我相信你错了 - reauthenticateAndRetrieveDataWithCredential 已被弃用:firebase.google.com/docs/reference/js/…
    • @maudulus。是的。你说的对。就我而言,这是firebase版本问题。我使用的是firebase5.7。 firebase.User.prototype.reauthenticateWithCredential 已弃用。请改用 firebase.User.prototype.reauthenticateAndRetrieveDataWithCredential。
    【解决方案3】:

    有多种方法可以重新进行身份验证。见参考:https://firebase.google.com/docs/reference/js/firebase.User

    firebase
    .auth()
    .currentUser.reauthenticateWithPopup(new firebase.auth.GoogleAuthProvider())
    .then((UserCredential) => {
        console.log("re-outh", UserCredential);
    });
    

    如果您的应用允许多种身份验证方法,您可能需要先了解使用了哪些 privider。您可以通过查看firebase.auth().currentUser.providerData 数组来做到这一点。

    【讨论】:

      【解决方案4】:

      我同意文档对此并不十分清楚。但是在 API 参考上再深入一点,我发现了 firebase.auth.AuthCredentialthis,我猜你应该把它传递给 reauthenticate()

      我在这里猜测,但我会开始尝试记录 firebase.auth() 以查看那里是否有任何 credential 对象。

      我想它看起来像下面这样:

      user.reauthenticate(firebase.auth().credential).then(function() {
      

      【讨论】:

      • 我设法让它工作,我正在写一个答案。您忘记了答案中的电子邮件和密码 :)
      【解决方案5】:

      现在方法有一个小的变化,因为两个发布的答案都被弃用了,

          val user = auth.currentUser
          user?.let { _user ->
              val credentials = EmailAuthProvider.getCredential(
                  _user.email!!,
                  "userPassword"
              )
              _user.reauthenticate(credentials).addOnCompleteListener { _reauthenticateTask ->
        }
      

      【讨论】:

        【解决方案6】:
        final FirebaseUser fireBaseUser = FirebaseAuth.getInstance().getCurrentUser();
        AuthCredential credential = EmailAuthProvider.getCredential(fireBaseUser.getEmail(), storedPassword);
        fireBaseUser.reauthenticate(credential).addOnCompleteListener(new OnCompleteListener<Void>() {
             @Override
             public void onComplete(@NonNull Task<Void> reAuthenticateTask) {
                  if (!reAuthenticateTask.isSuccessful())
                       ...
             }
        });
        

        【讨论】:

          猜你喜欢
          • 2017-09-12
          • 2015-05-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-16
          • 2021-06-09
          • 1970-01-01
          • 1970-01-01
          • 2023-03-28
          相关资源
          最近更新 更多