使用 JWT 和 Logto 保护你的 Express.js API
学习如何使用 JSON Web Tokens (JWT) 和 Logto 保护你的 Express.js API 端点。
学习如何使用 JSON Web Tokens (JWT) 和 Logto 保护你的 Express.js API 端点。
当你在开发 web 应用程序时,保护 API 端点免受未经授权的访问是至关重要的。想象一下你正在构建一个在线购物网站;你肯定不希望网络窃贼利用你的 API。
假设你已经构建了一个带有用户认证的 Express.js 应用程序,用户必须在进行某些操作之前登录。如果没有,你可以使用 Logto 开始你的旅程。只需几行代码即可建立用户认证流程。
然而,即使在用户认证之后,你仍然面临多种选择来保护你的 API 端点。不幸的是,大多数这些选项都有其缺点:
在本教程中,我们将演示如何使用 JSON Web Tokens (JWT) 和 Logto 加固你的 API 端点。这种方法提供了可扩展性和最小的额外成本。
在深入之前,请确保你具备以下条件:
Logto 充分利用 RFC 8707:OAuth 2.0 的资源指标 来保护你的 API 端点。这意味着你可以使用实际 URL 来定义你的 API 资源。
导航到 Logto 控制台中的 "API 资源" 选项卡,点击 "创建 API 资源" 来创建一个新的。例如,如果你想保护 /api/products 端点,可以使用 URL https://yourdomain.com/api/products 作为标识符。

继续操作时,你需要将 Logto SDK 集成到客户端应用程序中。此应用程序可能与你的 Express.js 后端不同;例如,你可能有一个使用 Express.js 作为后端 API 服务器的 React 应用。
你还需要调整 Logto SDK 配置,告知 Logto 你希望在此授权中请求你的 API 的访问令牌。以下是使用 React 的示例:
一旦用户使用 Logto 登录,Logto SDK 中的 isAuthenticated 将变为 true:
现在,你可以使用 getAccessToken 方法为你的 API 获取访问令牌:
最后,将此访问令牌包含在向你的 API 发出请求时的 Authorization 头中:
在你的 Express.js 应用程序中,安装 jose 库用于 JWT 验证:
由于我们使用的是 Bearer 认证,从 Authorization 头提取访问令牌:
随后,创建一个中间件来验证访问令牌:
你可以现在使用这个中间件来保护你的 API 端点:
通过这种方法,你不需要每次请求到来时与 Logto 服务器联系。相反,你从 Logto 服务器获取 JSON Web 密钥集 (JWKS) 一次,然后在本地验证访问令牌。
到目前为止,我们仅验证用户已使用 Logto 登录。我们仍然不知道用户是否拥有访问 API 端点的适当权限。这是因为 Logto 允许任何人为现有的 API 资源获取访问令牌。
为了解决这个问题,我们可以使用基于角色的访问控制 (RBAC)。在 Logto 中,你可以定义角色并为其分配权限。参考本教程了解如何在 Logto 中定义角色和权限。
定义角色和权限后,你可以将 scopes 选项添加到 LogtoProvider 组件:
Logto 然后只会向用户签发带有适当范围的访问令牌。例如,如果用户只有 read:products 范围,访问令牌将只包含该范围:
如果用户同时具有 read:products 和 write:products 范围,访问令牌将包含以空格分隔的两个范围:
在你的 Express.js 应用程序中,你可以在授予对 API 端点的访问之前验证访问令牌是否包含正确的范围:
在确保可扩展性的同时保护 API 端点并非易事。在 Logto,我们致力于简化开发人员的请求认证,使你可以更专注于业务逻辑。
如有任何疑问,欢迎加入我们的 Discord 服务器。我们的社区始终乐意为你提供帮助。