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

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

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

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

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

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

使用过的包:hapinode-openid-client

【问题讨论】:

    标签: jwt openid-connect openid


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-02-24
      • 2015-06-27
      • 2022-01-06
      • 2018-11-11
      • 2017-03-30
      • 2021-02-02
      • 2020-02-24
      • 2015-02-05
      相关资源
      最近更新 更多