OpenID Connect JWT 令牌验证和后端 api 的使用策略 - jwks 还是会话?

Posted

技术标签:

【中文标题】OpenID Connect JWT 令牌验证和后端 api 的使用策略 - jwks 还是会话?【英文标题】:OpenID Connect JWT token verification and usage strategy for backend api - jwks or session? 【发布时间】:2021-10-15 06:59:21 【问题描述】:

我对使用 OIDC 的后端 api 授权流程有点困惑。

我已经用 rest 后端 api 响应 SPA 应用程序。

我想允许应用客户端注册他们自己的 OIDC 提供商以进行登录/注册。

OpenID Connect JWT 令牌验证和使用的策略是什么?

目前我这样做:

    客户端添加提供程序,指定clientIdclientSecretissuer。 在后端,我使用 OIDC Discovery 获取提供程序元数据。 在客户端使用具有身份验证代码流的提供程序点击登录按钮后,我们最终在后端回调处理程序中交换代码:
  
      access_token: 'str',
      id_token: 'str.str.str',
      scope: 'openid profile email',
      expires_at: 1628797367,
      token_type: 'Bearer'
  

现在是一个问题,下一步该做什么?向应用发送什么令牌以供 api 请求使用以及如何在每个请求上验证它?

我可以将id_token 发送到应用程序,然后在每个api 请求上使用从提供程序JWKS 加载来验证id_token

或者我可以根据id_token 授权/注册用户并创建我自己的 JWT 令牌,该令牌将发送到应用程序以供 api 请求使用。

使用过的包:hapi、node-openid-client

【问题讨论】:

【参考方案1】:

所以 id_token 用于提供有关已验证用户的信息。访问令牌是您要用来访问用户资源的令牌。

您可以在后端验证和解码 id_token 并使用它在您的系统中注册一个新用户,并为他们创建一个会话 - 或者如果它是一个已经注册的用户,则只创建会话。

问题是 - 您的 SPA 调用的后端资源是什么。如果这些是 OIDC 提供者控制的 API,那么您只需将它们的访问令牌添加到请求中,它将被验证。不过,我假设这些是您的 API。那么你有两个选择:

    如果您从 OP 收到访问令牌,如果 OP 公开了自省端点,您仍然可以使用它来访问您的 API。每次从 SPA 收到请求时,您都必须调用 OP 来检查令牌是否有效,并可能获取与该令牌相关的数据——如发行者、主题、受众等。您可以使用这些声明来执行授权决策- 是否允许访问该请求。

    使用 OP 完成授权代码流程后,您可以根据从 OP 获得的信息颁发自己的访问令牌。然后,您可以轻松地在每个请求上验证该令牌。在这种情况下,您可以更好地控制该令牌的最终结果 - 例如,您可以为用户引入角色等。

如果您只访问自己的 API,并且您已经有一个用于执行 OIDC 流的后端,我建议您将来自 OP 的响应保留在后端,并向 SPA 发出一个普通的旧会话。您的 API 可以通过调用您的授权后端来验证会话。这样您就不会在 SPA 中放置任何令牌。

【讨论】:

以上是关于OpenID Connect JWT 令牌验证和后端 api 的使用策略 - jwks 还是会话?的主要内容,如果未能解决你的问题,请参考以下文章

验证 Google OpenID Connect JWT ID 令牌

Okta 使用 OpenID Connect 配置中的公钥验证 JWT 令牌

Asp.Net Core API OpenId-Connect 身份验证与 JWT 令牌使用 IdentityModel

openid connect owin 如何验证来自 Azure AD 的令牌?

如何使用 openid connect OIDC 加密 REST 正文

OpenID Connect Core 1.0ID Token