关于其余部分:OpenID Connect / Oauth2-缓存/使用令牌

OpenID Connect/Oauth2 - cache/use tokens

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

但是我应该在API中将哪个令牌返回给用户。它应该是来自OpenID Connect层的oauth2访问ID还是token_id,或者两者都是?

因此,我为API的最终用户看到了这些替代方案:

1
Authorization: Bearer
1
Authorization: Bearer <token_id>
1
2
Authorization: Bearer
TokenID: <token_id>

在不将token_id / access_id保留在系统中的情况下,我需要针对每个API请求从客户端获取此令牌。令牌ID包含JWT声明(子),因此我需要使用它来验证客户端可以在我的系统中执行的操作。

我是否需要在本地数据库中存储以下任何ID以验证API请求,或者用户应提供它?

  • 刷新令牌?
  • 访问令牌?
  • 令牌ID?

我基本上是在进行身份验证和用户标识之后。我没有访问过除此以外的任何外部资源。

最后一个问题。我是否需要验证对IDP的每个请求的访问令牌,还是可以对其进行缓存?使用OpenID Connect时是否需要同时验证访问令牌和令牌ID?

编辑:

我的系统本身具有REST API和其自己的权限系统。权限系统使用由使用OpenID Connect的任何身份验证系统提供的用户ID。将第一个用户手动添加到权限系统。

思想流:

  • 我系统的用户请求https:// mysystem / login
  • 用户被重定向到https:// idp / auth
  • IDP将成功登录重定向到https:// mysystem / callback
    我的系统从令牌ID JWT获取用户ID(子)和电子邮件。
  • 然后使用访问令牌(不是OIDC令牌ID)返回给用户。
  • 用户现在可以执行:curl -H"授权:承载
    访问令牌" https:// mysytem / some / resource
  • Mysytem从用户那里收到此请求,但不知道如何将访问令牌映射到数据库中的用户ID,而没有向IDP询问用户ID。
  • 我想使用外部IDP来让用户登录,而不是从第三方系统访问资源。


    更新

    访问令牌没有用户ID-请参见本文的第14步。为什么您认为不是呢?

    该规则的一个例外是没有用户参与时-应用到应用之间的通信(例如,客户端凭据流)。但是您没有使用它。

    原始答案

    您应该只将UI中的完全访问权(承载)令牌发送到API,并且无需在数据库中存储令牌详细信息。

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

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

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

    我的一些博客文章更详细地介绍了这些主题:

    • 用户数据管理
    • API授权和声明缓存

    我的博客还链接到将这些概念联系在一起的示例代码。