【问题标题】:Firebase Admin SDK NodeJS -- "There is no user record corresponding to the provided identifier." ErrorFirebase Admin SDK NodeJS - “没有与提供的标识符相对应的用户记录。”错误
【发布时间】:2020-01-07 22:46:05
【问题描述】:

按照 https://firebase.google.com/docs/auth/admin/email-action-links#generate_email_verification_link 上的 Firebase SDK 文档并得到以下错误,这没什么意义,因为该函数是使用经过身份验证的 admin.auth() 从服务器环境触发的。

有人知道是什么原因造成的吗?

Error from admin.auth().generateEmailVerificationLink : { Error: There is no user record corresponding to the provided identifier.
    at FirebaseAuthError.FirebaseError [as constructor] (/srv/node_modules/firebase-admin/lib/utils/error.js:42:28)
    at FirebaseAuthError.PrefixedFirebaseError [as constructor] (/srv/node_modules/firebase-admin/lib/utils/error.js:88:28)
    at new FirebaseAuthError (/srv/node_modules/firebase-admin/lib/utils/error.js:147:16)
    at Function.FirebaseAuthError.fromServerError (/srv/node_modules/firebase-admin/lib/utils/error.js:186:16)
    at /srv/node_modules/firebase-admin/lib/auth/auth-api-request.js:1201:49
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:229:7)
  errorInfo: 
   { code: 'auth/user-not-found',
     message: 'There is no user record corresponding to the provided identifier.' },
  codePrefix: 'auth' }

代码是这样的:

exports = module.exports = functions.firestore
  .document("xxx/{docId}")
  .onCreate(async (snap, context) => {
    let yyy = snap.data();
    let { uid, userData } = yyy;
    console.log("from sendEmailVerification, uid, userdata: ", userData);
    const actionCodeSettings = {
      url: `${emailConfirmationUrl}`,
      handleCodeInApp: false
    };
    return admin.auth().generateEmailVerificationLink(userData.email, actionCodeSettings)
      .then(async (link) => {
        console.log("uid from generateEmailVerificationLink and email: ", uid, userData.email)
        await admin.firestore().collection('users').doc(uid).set({
          verificationLink: link,
          emailVerified: false
        }, { merge: true });
        return emailfunc.sendCustomVerificationEmail(userData.email, link);
      })
      .catch((err) => {
        console.error("Error from admin.auth().generateEmailVerificationLink :", err);
        return Promise.reject(err);
      });
  });

【问题讨论】:

    标签: firebase google-cloud-firestore firebase-admin


    【解决方案1】:

    您从数据库 (Firestore) 中读取了用户的电子邮件地址。但是,该用户帐户在 Firebase 身份验证中不存在。如果您希望使用像 getUser()generateEmailVerificationLink() 这样的 API,它也必须存在于 Firebase Auth 中。仅在 Firestore 中拥有它是不够的。

    【讨论】:

    • 对不起,这个答案很混乱。当然,用户存在于 Firebase Auth 中——它是那里的匿名用户。这就是发送验证链接的重点 - 让用户确认它,以便他们的电子邮件可以添加到他们的匿名(不再)帐户中。我认为错误是错误地生成的。 admin.auth() 应该能够向任何用户发送电子邮件。如果您的建议是这种情况,那么 uid 在哪里传递?示例中的函数甚至不需要它...
    • 如果 generateEmailVerification 是用于服务器端验证用户电子邮件的错误函数,您知道改用哪个函数吗?用例非常简单和常见 - 确认某人的电子邮件(尚未在他们的匿名帐户上)并在确认后将其与他们的帐户相关联。
    • 这不是它的工作原理。在调用 generateEmailVerificationLink() 之前,该电子邮件地址应该已经在 Firebase Auth UserRecord 中。当用户最终通过以下链接验证电子邮件时,UserRecord.emailVerified 字段将设置为 true。您不能使用此 API 为任意电子邮件地址生成验证链接。
    • 好的,那么我们如何为刚刚提供电子邮件地址(可能是也可能不是他的或正确的)的匿名用户设置用户记录?
    • 我认为你应该在客户端应用程序中实现它。首先是set the user's email address,然后是send the verification email。如果必须在服务器端执行第二步,只需设置用户的电子邮件,并更新 Firestore 文档以触发云功能。
    猜你喜欢
    • 2019-06-02
    • 2021-09-18
    • 2018-03-22
    • 1970-01-01
    • 2017-12-26
    • 2021-04-20
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多