type
status
date
slug
summary
tags
category
icon
password
Sub-item
Last edited time
Mar 24, 2024 03:12 AM
Parent item
领域
项目的当前版本难以在未来维护和开发。在下一章中我们将开始重构过程。即使现在添加新功能也可能不像开发新功能那么容易(即使应用程序仍然很新)。但在此之前,我们有一个重要的主题要讨论——身份验证。这是应用程序中不需要重构的部分。
不要重复造轮子
身份认证尽量使用成熟的方案,不要重复造轮子, 不要自定义身份认证的方案,否则一旦发现漏洞,将非常危险。有个人或者公司能实现完美的身份验证吗?即使是拥有数百名研究人员和开发人员只致力于身份验证的巨头也无法做到这一点。因此,不要花哨的自定义的身份认证。
使用 Firebase 身份验证
有许多解决方案可用于实现身份验证。在本章中,我们希望采用适合我们上下文的最快、最简单的方法。我们也不考虑任何绑定供应商的问题——我们将在未来解决这个问题(例如使用JWT)。我们为本电子书创建的 Wild Workouts 示例应用程序现在托管在 Firebase 托管上。使用 Firebase Authentication 是一个自然的选择。该解决方案有一个显着的优势——它在后端和前端方面几乎完全开箱即用。
前端
我们需要做的第一件事是 Firebase SDK 的初始化。接下来,在主页的表单中,我们调用
loginUser
函数。该函数调用 Auth.login
、Auth.waitForAuthReady
和 Auth.getJwtToken
。结果通过 setApiClientsAuth
设置为 OpenAPI 生成的客户端。下面看Auth的实现(如果是测试环境, Auth可以通过Mock实现)。
登录后调用
firebase.auth().signInWithEmailAndPassword
。如果一切正常,auth().currentUser.getIdTok
将返回我们的 JWT 令牌。接下来,我们需要将 OpenAPI 生成的客户端属性的
authentications['bearerAuth'].accessToken
设置为从 Auth.getJwtToken(false)
接收的 JWT token。现在我们需要将OpenAPI 客户端设置为此token,瞧!我们所有的请求现在都已通过身份验证。注意: OpenAPI中需要配置身份认证的相关定义。
后端
最后一部分实际上是在我们的 HTTP 服务器中使用此身份验证。我创建了一个简单的 HTTP 中间件来为我们完成该任务。该中间件执行三件事:
- 从 HTTP 标头获取令牌
- 使用 Firebase 身份验证客户端验证令牌
- 将用户数据保存在凭据中
现在可以使用
auth.UserFromCtx
函数在每个 HTTP 请求中访问用户数据。也可以根据角色限制用户的权限:
添加用户
在我们的例子中,我们在users服务启动期间添加默认测试用户,也可以从 Firebase UI 添加它们。但有些用户声明数据的设置必须需要通过 API 来完成,例如角色数据。
本地开发用的认证Mock
由于没有Firebase的认证模拟器,如果希望能够在本地运行我的应用程序,而无需任何外部依赖项,那就只能做一个简单的mock实现。
前端只要使用
mock secret
来生成一个jwt的token即可,后端使用mock secret
来验证即可。本地测试Firebase认证
改动较多,跳过。