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

OpenID Connect JWT token verification and usage strategy for backend api - jwks or session?

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

我有 React SPA 应用和 rest 后端 api。

我想允许应用程序客户端注册他们自己的 OIDC 提供商以达到 login/registration 目的。

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

目前我这样做:

  1. 客户添加提供商指定 clientIdclientSecretissuer
  2. 在后端,我使用 OIDC Discovery 获取提供者元数据。
  3. 客户端使用带有授权代码流的提供程序点击登录按钮后,我们最终到达后端回调处理程序,我在其中交换代码:
  {
      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

或者我可以只 authorize/register 基于 id_token 的用户并创建我自己的 JWT 令牌,该令牌将发送到应用程序以供 api 请求使用。

已用包:hapi, node-openid-client

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

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

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

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

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

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