[英]OpenID Connect/Oauth2 - cache/use tokens
我有一个带有 REST API 的系统。 REST API 的用户应该能够使用 OpenID Connect over Oauth2 进行身份验证。 系统本身有自己的权限系统。 我需要将 IDP 用户映射到我的本地权限系统。 我正在考虑将本地数据库中的openid范围子键保存为唯一的用户标识符。
但是我应该在 API 中返回给用户哪个令牌。 它应该是来自 OpenID Connect 层的 oauth2 访问 id 或 token_id,还是两者兼而有之?
所以我看到了这些 API 最终用户的替代方案:
Authorization: Bearer <access_id>
Authorization: Bearer <token_id>
Authorization: Bearer <access_id>
TokenID: <token_id>
如果不将 token_id/access_id 保留在系统中,我需要根据 API 请求从客户端获取此信息。 令牌 ID 包含 JWT 声明(子),因此我需要它来验证客户端可以在我的系统中执行的操作。
我是否需要将以下任何 ID 存储在我的本地数据库中以验证 API 请求,还是应该由用户提供?
我基本上是在认证和用户识别之后。 我不是在访问除此之外的任何外部资源。
还有最后一个问题。 我是否需要验证对 IDP 的每个请求的访问令牌,或者我可以缓存它吗? 使用 OpenID Connect 时是否需要同时验证访问令牌和令牌 ID?
编辑:
我的系统本身有一个 REST API 和它自己的权限系统。 权限系统使用由使用 OpenID Connect 的任何身份验证系统提供的用户 ID。 第一个用户被手动添加到权限系统中。
思想流:
我想使用外部 IDP 让用户登录,而不是从 3rd 方系统访问资源。
更新
访问令牌确实有用户 ID - 请参阅本文的第 14 步。 为什么你认为没有?
此规则的一个例外是当没有用户参与时 - 用于应用程序到应用程序的通信(例如客户端凭据流)。 但你没有使用它。
原答案
您应该只将完整的访问(承载)令牌从 UI 发送到 API - 并且您不需要将令牌详细信息存储在您的数据库中。
迁移到 OAuth 架构时,您会将用户数据存储在 2 个位置:
正如您所建议的那样,将唯一用户 ID 存储在产品数据中以进行关联和跟踪是很常见的。 登录后,您的 API 通常需要根据产品数据进行授权。
我的几篇博文更详细地介绍了这些主题:
我的博客还链接到将这些概念联系在一起的示例代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.