OpenID Connect/Oauth2 - cache/use 个令牌

OpenID Connect/Oauth2 - cache/use tokens

我有一个带有 REST API 的系统。 REST API 的用户应该能够通过 Oauth2 使用 OpenID Connect 进行身份验证。系统本身有自己的权限系统。我需要将 IDPs 用户映射到我的本地权限系统。我正在考虑将本地数据库中的 openid 范围 sub 键保存为唯一的用户标识符。

但是我应该 return 给 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。第一个用户手动添加到权限系统。

思路:

  1. 我的系统请求的用户https://mysystem/login
  2. 用户被重定向到 https://idp/auth
  3. IDP 将成功登录重定向到 https://mysystem/callback 我的系统从令牌 ID JWT 获取用户 ID (sub) 和电子邮件。
  4. 然后使用访问令牌(不是 OIDC 令牌 ID)返回给用户。
  5. 用户现在可以执行:curl -H "Authorization: bearer 访问令牌" https://mysytem/some/resource
  6. Mysytem 从用户那里得到这个请求,但不知道如何将访问令牌映射到数据库中的用户 ID w/o 向 IDP 询问用户 ID。

我想使用外部 IDP 让用户登录,而不是从第 3 方系统获取资源。

更新

访问令牌确实有一个用户 ID - 请参阅 step 14 of this write up。为什么你认为没有?

此规则的一个例外是当没有用户参与时 - 对于应用程序到应用程序的通信(例如客户端凭据流)。但是你没有使用那个。

原始答案

您应该只将完全访问(不记名)令牌从 UI 发送到 API - 您不需要在数据库中存储令牌详细信息。

迁移到 OAuth 架构时,您将在 2 个位置存储用户数据:

  • 您的普通产品数据库 - 通常包括角色和用户权限
  • 授权服务器 - 生成唯一的用户 ID

正如您所建议的,将唯一用户 ID 存储在产品数据中以进行关联和跟踪是很常见的。登录后,您的 API 通常需要根据产品数据进行授权。

我的几篇博文更详细地介绍了这些主题:

我的博客还链接到 sample code,将这些概念联系在一起。