Firebase 安全规则:在 request.auth 中传递自定义 UID,无需 Firebase 身份验证

Firebase Security Rules: Pass custom UID in request.auth without Firebase Authentication

我正在使用 next-auth v4、Firebase v9 和 NextJS 并尝试解决 Firebase 安全规则的问题。

我的安全规则在 request.auth 中没有收到任何内容,因为我正在使用 next-auth,但我找不到将我的 next-auth 会话 ID 作为 UID 在 firebase 请求中传递的方法。

在 next-auth 中,我使用会话回调来确定何时在数据库中创建新用户:

export default NextAuth({
  providers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_CLIENT_ID,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    }),
  ],
  secret: process.env.JWT_SECRET,
  callbacks: {
    async session({ session, token }) {
      session.id = token?.sub;

      const userDocRef = doc(db, "users", session.id);
      const userDocSnap = await getDoc(userDocRef);

      if (!userDocSnap.exists()) {
        await setDoc(doc(db, "users", session.id), {
          uid: session.id,
          name: session.user.name,
          image: session.user.image,
          email: session.user.email,
        });
      }

我怎样才能做到这一点,以便我能够从 firebase 端验证 userId,同时仍然使用 next-auth。有没有办法将 session.id 从我的 JWT 传递到 firebase?

documentation 中指出:

If your app uses Firebase Authentication or Google Cloud Identity Platform, the request.auth variable contains the authentication information for the client requesting data.

Firebase 安全规则仅在使用 Firebase 身份验证或 Google Cloud Identity 时接收用户信息。它不能与其他身份验证系统一起使用。当前登录用户的 UID 始终由 Firebase SDK 安全提供。无法将 UID“传递”到安全规则中 - 这根本不安全,因为很容易伪造用户。

也许您可以使用某种 custom authentication 实现您的创作来连接您现在拥有的和 Firebase。您仍然需要使用 Firebase Auth SDK 来让用户登录。