返回

如何在 Cloud Function 中安全地重新验证当前用户:分步指南

javascript

在 Cloud Function 中重新验证当前用户:分步指南

作为一名开发人员,在需要在不存储用户密码的情况下更新密码时,重新验证当前用户至关重要。使用 Firebase 的身份验证服务,结合 Cloud Functions 的灵活性,让我们深入了解如何在 Cloud Function 中重新验证当前用户。

获取当前用户

在 Cloud Function 中,通过 context.auth.token 属性轻松获取当前用户。它包含有关当前登录用户的详细信息,如电子邮件地址和用户 ID。

const { email, uid: userId } = context.auth.token;

重新验证用户

由于 firebase-admin SDK 缺乏 signInWithEmailAndPassword 方法,因此我们需要一个替代方案。verifyPassword 方法接受用户 ID 和密码,如果密码正确,将返回 true

const isValid = await auth.verifyPassword(userId, currentPassword);

更新密码和发送电子邮件

验证密码后,使用 updateUser 方法更新用户的密码。此外,使用 sendPasswordUpdateEmail 方法发送密码更新电子邮件。

await auth.updateUser(userId, { password: newPassword });
sendPasswordUpdateEmail(email);

完整代码

const { auth, functions } = require("../../services/firebase");
...

exports.updatePassword = functions
  .region("us-central1")
  .runWith({ memory: "1GB", timeoutSeconds: 120 })
  .https.onCall(async (data, context) => {
    const { currentPassowrd, newPassword } = data;

    const { email, uid: userId } = context.auth.token;

    if (!userId) { throw ... }

    try {
      const isValid = await auth.verifyPassword(userId, currentPassword);

      if (!isValid) { throw AuthErrors.incorrectPassword(); }

      await auth.updateUser(userId, { password: newPassword });

      sendPasswordUpdateEmail(email);
    } catch (err) { throw AuthErrors.cannotUpdatePassword(); }
  });

常见问题解答

1. 为什么需要重新验证用户?

重新验证对于在不存储用户密码的情况下更新密码至关重要。

2. Cloud Function 中如何使用 verifyPassword 方法?

verifyPassword 接受用户 ID 和密码,如果密码正确,则返回 true

3. updateUser 方法用来做什么?

updateUser 方法用于更新用户的密码。

4. 如何发送密码更新电子邮件?

使用 sendPasswordUpdateEmail 方法发送密码更新电子邮件。

5. Cloud Function 中重新验证的好处是什么?

重新验证提供了一种安全的方式来更新密码,同时符合 Firebase 的最佳实践。