简体中文
  • express-js
  • javascript
  • tutorial
  • auth
  • authentication
  • jwt
  • identity
  • api

使用 JWT 和 Logto 保护你的 Express.js API

学习如何使用 JSON Web Tokens (JWT) 和 Logto 保护你的 Express.js API 端点。

Gao
Gao
Founder

介绍

当你在开发 web 应用程序时,保护 API 端点免受未经授权的访问是至关重要的。想象一下你正在构建一个在线购物网站;你肯定不希望网络窃贼利用你的 API。

假设你已经构建了一个带有用户认证的 Express.js 应用程序,用户必须在进行某些操作之前登录。如果没有,你可以使用 Logto 开始你的旅程。只需几行代码即可建立用户认证流程。

然而,即使在用户认证之后,你仍然面临多种选择来保护你的 API 端点。不幸的是,大多数这些选项都有其缺点:

  • 基于会话的认证:将 API 绑定到会话存储,这不具备可扩展性,也不适合微服务。
  • 调用认证服务:这会引入额外的网络调用,增加延迟和成本。一些认证服务甚至会根据 API 调用量收费,可能导致巨额费用。

在本教程中,我们将演示如何使用 JSON Web Tokens (JWT) 和 Logto 加固你的 API 端点。这种方法提供了可扩展性和最小的额外成本。

前提条件

在深入之前,请确保你具备以下条件:

  • 一个 Logto 账户。如果没有,你可以 免费注册
  • 一个需要 API 保护的 Express.js 项目和一个使用该 API 的客户端应用程序。
  • 基本了解 JSON Web Token (JWT)

在 Logto 中定义你的 API 资源

Logto 充分利用 RFC 8707:OAuth 2.0 的资源指标 来保护你的 API 端点。这意味着你可以使用实际 URL 来定义你的 API 资源。

导航到 Logto 控制台中的 "API 资源" 选项卡,点击 "创建 API 资源" 来创建一个新的。例如,如果你想保护 /api/products 端点,可以使用 URL https://yourdomain.com/api/products 作为标识符。

Create API resource

在客户端应用程序中获取访问令牌

继续操作时,你需要将 Logto SDK 集成到客户端应用程序中。此应用程序可能与你的 Express.js 后端不同;例如,你可能有一个使用 Express.js 作为后端 API 服务器的 React 应用。

你还需要调整 Logto SDK 配置,告知 Logto 你希望在此授权中请求你的 API 的访问令牌。以下是使用 React 的示例:

一旦用户使用 Logto 登录,Logto SDK 中的 isAuthenticated 将变为 true

现在,你可以使用 getAccessToken 方法为你的 API 获取访问令牌:

最后,将此访问令牌包含在向你的 API 发出请求时的 Authorization 头中:

在 API 中验证访问令牌

在你的 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:productswrite:products 范围,访问令牌将包含以空格分隔的两个范围:

在你的 Express.js 应用程序中,你可以在授予对 API 端点的访问之前验证访问令牌是否包含正确的范围:

结论

在确保可扩展性的同时保护 API 端点并非易事。在 Logto,我们致力于简化开发人员的请求认证,使你可以更专注于业务逻辑。

如有任何疑问,欢迎加入我们的 Discord 服务器。我们的社区始终乐意为你提供帮助。