【发布时间】:2025-12-11 12:25:02
【问题描述】:
我正在努力实施 oauth2 以保护将调用 REST API 并允许其他潜在客户访问相同的 REST API 的 Web 应用程序。我想使用基于角色的访问来控制从 API 返回的数据。
我将使用 Keycloak 作为授权服务器以及用户/组管理。
用例是这样的
- 我将创建带有公共客户端 (SPA) 和机密的可能仅承载客户端 (REST API) 的 keycloak 领域,以及将成为这些组一部分的组和用户
- 用户将通过授权流程登录 SPA 并收到访问令牌。
- SPA 将向 REST 服务发出请求 (XHR),将令牌作为不记名令牌传递,并根据用户所在的组检索数据或执行允许的操作。
我正在尝试了解/最佳实践我应该将用户所属的组列表存储在哪里。 SPA 和/或 REST 服务可以检索和传递的访问令牌还是 ID 令牌必须使用访问令牌和 userinfo 端点从授权服务器检索该数据。似乎 keycloak 将 JWT 用于访问和 ID 令牌,并且角色/组可以包含在两者中。我阅读了混合建议,即 REST 服务不应读取访问令牌,仅用于证明用户已通过身份验证,但后来我看到它用于传递用户组。
我的另一个问题是,如果我想允许自动化客户端访问无法使用授权流的 REST API,最佳实践是使用客户端流并在 keycloak 中加载该客户端并提供客户端 clientId 和 secret 以便能够检索访问令牌,使用它对 REST 服务进行身份验证(承载身份验证标头)
更新
我还有几个后续问题希望大家弄清楚。
至于 ID 令牌,我认为 ID 令牌仅应由正在验证用户的应用程序 (SPA) 使用,并将获取有关用户的信息(用户名、电子邮件和其他一些东西)关于声明和用户批准权限。可能会在应用程序中显示这些内容。 ID 令牌不应(永远)发送到 REST API 以检索数据。
另一方面,访问令牌不应该被应用程序 (SPA) 读取,而是在对 API 服务器 (Bearer $AUTH_TOKEN) 的每个请求中使用,API 服务器验证令牌,然后检索用户的组信息并返回允许的响应。
尚不清楚的是,如果应用程序收到授权令牌并不意味着用户已通过身份验证。为什么我们需要 ID Token。
另外,如果访问令牌并不总是携带信息并且可能只是一个随机字符串,那么您将如何知道用户的权限。我在读到有两种类型的令牌“标识符类型”和“自包含类型”。我猜如果令牌是标识符类型,那么 REST 服务将不得不向授权服务器发送请求,以通过追溯 api 获取该信息(组/权限)。
找到两篇关于这个的好文章:
https://darutk.medium.com/oauth-access-token-implementation-30c2e8b90ff0.
https://darutk.medium.com/api-protection-by-id-token-3123481e96f2
【问题讨论】: