当 Firebase Auth 无法正常工作时我如何修复 CodePod(并迁移到 Auth0)

42 阅读2分钟

最初构建 CodePod 应用时,我使用 Firebase Authentication 来管理用户,并使用 Firestore 来存储用户数据。一切运行正常,直到我开始遇到权限错误和身份验证问题——尤其是在尝试添加更多高级登录功能之后。

我面临的问题 Firebase 权限错误:我的前端尝试直接访问 Firestore,但由于没有有效的 Firebase Auth 会话,我一直收到“缺少或权限不足”错误。 Auth0 集成问题:当我切换到 Auth0 进行身份验证时,用户对象结构发生了变化(uid 变成了 sub),这破坏了我现有的代码。 内容安全策略 (CSP) 违规:Auth0 的登录弹出窗口和 iframe 被我的服务器的 CSP 设置阻止。 会话管理:Auth0 缓存了登录状态,导致切换帐户或测试不同用户变得困难。## 我是如何修复它的 ### 1. 将 Auth0 用户映射到 Firebase 格式 我更新了 Auth 上下文,以便 Auth0 用户对象与我的应用对 Firebase 的期望相匹配。这意味着将 user.sub 映射到 currentUser.uid ,并包含其他属性,例如 email 、 displayName 和 photoURL 。 const currentUser = user ? { uid: user.sub, email: user.email, displayName: user.name, photoURL: user.picture, emailVerified: user.email_verified } : null; 2. 停止从前端直接访问 Firestore 我没有让前端直接与 Firestore 通信,而是为用户数据创建了后端 API 端点。这样,后端可以使用 Firebase Admin SDK 安全地访问 Firestore,而前端只需调用 API 即可。

// routes/users.js router.get('/api/users/:id', authenticateToken, async (req, res) => { // ...fetch user from Firestore using Admin SDK... }); 3. 修复内容安全策略(CSP)设置 我更新了服务器的 CSP 标头以允许 frame-src 和 connect-src 中的 Auth0 域,并将 Cross-Origin-Opener-Policy 更改为“unsafe-none”,以便 Auth0 弹出窗口可以与我的应用程序通信。

app.use(helmet({ crossOriginOpenerPolicy: { policy: "unsafe-none" }, contentSecurityPolicy: { directives: { frameSrc: [ "'self'", ". com" ], connectSrc: [ "'self'", " com" ] } } })); 4. 改进的会话管理 为了确保用户可以选择他们的帐户并避免自动登录,我使用了 Auth0 的提示:“select_account”选项。

我学到了什么 从 Firebase Auth 迁移到 Auth0 不仅仅是交换库 - 您还需要更新用户对象映射、后端 API 和安全策略。 后端 API 比从前端直接访问数据库更安全、更灵活。 集成第三方身份验证时,请务必检查您的 CSP 和 CORS 设置。 通过适当的会话管理,使用多个帐户测试身份验证流程变得更加容易。查看更多www.youjiutian.com