跳到主要内容

保护全局 API 资源

使用 Logto 的基于角色的访问控制 (RBAC) 保护产品范围内的 API。分配全局角色和权限,以控制你应用中所有用户和客户端的访问。

什么是全局 API 资源?​

全局 API 资源是你应用中所有用户都可以访问的端点或服务,无论属于哪个组织或租户。这些通常是面向公众的 API、核心产品服务,或任何不限定于特定组织的端点。

使用场景包括

  • 在你的用户群体中共享的公共 API 或端点。
  • 不绑定多租户的微服务。
  • 所有客户都在使用的核心应用 API(如 /api/users、/api/products)。

Logto 允许你结合 OAuth 2.1 和灵活的基于角色的访问控制来保护这些 API。

在 Logto 中的工作原理​

  • API 资源和权限是全局注册的:你想要保护的每个 API 都用唯一的资源指示器(URI)和一组控制访问的权限(scopes)进行定义。
  • 访问由全局角色控制:你可以将权限分配给角色,然后将角色分配给用户或客户端。
  • 与组织级权限分离:全局 API 资源没有组织上下文。但如有需要,可以与组织角色结合使用,为访问提供额外的上下文。要保护组织级 API,请参见 保护组织级 API 资源。
全局 API 资源 RBAC

实现概览​

  1. 注册你的 API 资源,并在 Logto 中定义其权限。
  2. 定义角色,为访问 API 分配所需权限。
  3. 分配角色给用户或客户端。
  4. 使用 OAuth 2.0 授权流程获取 API 的访问令牌(resource 参数必须与注册的 API 标识符一致)。
  5. 在你的 API 中验证访问令牌以强制执行权限。

理解资源指示器​

Logto 按照 RFC 8707: OAuth 2.0 的资源指示器 建模 API 资源。资源指示器是唯一标识所请求目标 API 或服务的 URI。

要点

  • 资源指示器必须是绝对 URI(如 https://api.example.com)
  • 不包含片段部分;尽量避免使用查询字符串。
  • 资源指示器支持受众限制令牌和多 API 架构。

示例

  • Management API: https://my-tenant.logto.app/api
  • 自定义全局 API: https://api.yourapp.com

授权 (Authorization) 流程:认证 (Authentication) 并保护你的 API​

下述流程适用于交互式用户认证 (Authentication)(浏览器 / 应用)和后端机器对机器 (M2M) 场景。

请注意,该流程未包含所有必需参数或请求头的详细信息,重点展示关键步骤。继续阅读以了解实际流程。

用户认证 (Authentication) = 浏览器 / 应用。M2M = 使用客户端凭证的后端服务或脚本。

备注:

resource 参数必须与 Logto 中注册的 API 标识符(资源指示器)完全一致。

实现步骤​

注册你的 API 资源​

  1. 前往 控制台 → API 资源。
  2. 创建新的 API 资源(如 https://api.yourapp.com/org),并定义其权限(scopes)。

完整配置步骤见 定义带权限的 API 资源。

设置全局角色​

  1. 前往 控制台 → 角色。
  2. 创建与你 API 权限对应的角色(如 read:products、write:products)。
  3. 将这些角色分配给需要访问 API 的用户或客户端。

完整配置步骤见 使用全局角色。

获取全局 API 资源的访问令牌 (访问令牌 (Access token))​

在访问全局 API 资源前,你的客户端必须获取访问令牌 (访问令牌 (Access token))。Logto 会为全局 API 资源签发 JSON Web Token (JWT) 作为访问令牌 (访问令牌 (Access token))。这通常通过 OAuth 2.0 授权码流程、刷新令牌 (刷新令牌 (Refresh token)) 流程 或 客户端凭证流程 完成。

授权码或刷新令牌流程​

所有 Logto 官方 SDK 都原生支持通过刷新令牌 (刷新令牌 (Refresh token)) 流程获取全局 API 资源的访问令牌 (访问令牌 (Access token))。你也可以使用标准 OAuth 2.0 / OIDC 客户端库实现该流程。

初始化 Logto 客户端时,将资源指示器添加到 resources 参数(数组),再将所需权限(scopes)添加到 scopes 参数。

用户认证 (Authentication) 后,在请求访问令牌 (访问令牌 (Access token)) 时,将资源指示器传入 resource 参数或类似参数(如调用 getAccessToken())。

各 SDK 详情见 快速上手。

客户端凭证流程​

对于机器对机器 (M2M) 场景,你可以使用客户端凭证流程获取全局 API 资源的访问令牌 (访问令牌 (Access token))。只需向 Logto 的 /oidc/token 端点发起 POST 请求,使用你的客户端 ID 和密钥即可请求访问令牌 (访问令牌 (Access token))。

请求中需包含两个关键参数:

  • resource:你要访问的 API 的资源指示器 URI(如 https://api.yourapp.com)。
  • scope:你要请求的 API 权限(如 read:products write:products)。

以下是使用客户端凭证模式的令牌请求非规范示例:

POST /oidc/token HTTP/1.1
Host: your.logto.endpoint
Content-Type: application/x-www-form-urlencoded
Authorization: Basic base64(client_id:client_secret)

grant_type=client_credentials
&resource=https://api.yourapp.com
&scope=read:products write:products

在你的 API 中验证 JWT 访问令牌 (访问令牌 (Access token))​

Logto 签发的 JWT 包含你的 API 可用于强制授权 (Authorization) 的声明 (Claims)。

当你的 API 收到带有 Logto 签发访问令牌 (访问令牌 (Access token)) 的请求时,你应:

  • 验证令牌签名(使用 Logto 的 JWKs)。
  • 确认令牌未过期(exp 声明 (Claim))。
  • 检查 iss(发行者 (Issuer))是否与你的 Logto 端点一致。
  • 确认 aud(受众 (Audience))是否与你注册的 API 资源标识符一致(如 https://api.yourapp.com)。
  • 拆分 scope 声明 (Claim)(以空格分隔),检查所需权限。

分步和特定语言指南见 如何验证访问令牌 (访问令牌 (Access token))。

可选:处理用户权限变更​

信息:

👷 功能开发中。🚧

最佳实践与安全建议​

  • 权限应以业务为驱动:使用清晰的名称映射到实际操作。
  • 令牌过期时间应短:降低令牌泄露风险。
  • 限制授予的权限 (Scopes):只给令牌实际需要的权限。
  • 使用受众 (Audience) 限制:始终验证 aud 声明 (Claim) 以防止滥用。

常见问题​

如果我的客户端不支持 resource 参数怎么办?​

在 Logto 控制台设置默认 API 资源。当令牌请求中未指定 resource 参数时,令牌将默认使用该受众 (Audience)。

为什么我的 API 返回 401 未授权 (Unauthorized)?​

请检查以下常见问题:

  • 令牌签名:确认你的后端正在从 Logto 获取正确的 JWKs
  • 令牌过期:确保令牌未过期(exp 声明 (Claim))
  • 受众 (Audience):确认 aud 声明 (Claim) 与你注册的 API 资源指示器一致
  • 所需权限 (Scopes):确认令牌在 scope 声明 (Claim) 中包含必要权限

如何在没有完整客户端的情况下测试?​

使用 个人访问令牌 模拟认证 (Authentication) 调用。这样你可以在不实现完整 OAuth 流程的情况下测试 API 端点。

延伸阅读​

如何验证访问令牌 (访问令牌 (Access token))

RBAC 实践:为你的应用实现安全授权 (Authorization)

自定义令牌声明 (Claims) RFC 8707:资源指示器