【问题标题】:Confusion with OIDC and access token scopes与 OIDC 和访问令牌范围混淆
【发布时间】:2022-01-17 17:29:25
【问题描述】:

我正在实现仅适用于具有特定范围的经典场景的用户可访问的 API。但是我不太了解访问令牌的一些内容。

访问令牌是 JWT

我认为这很简单,我只是接收 JWT,验证它,读取范围。

但由于访问令牌格式未标准化,JWT 可以包含任何内容。我应该假设每次都有范围吗?是否每个 IdP 都将它们放入其中?

访问令牌不透明(或者 JWT 没有范围?)

我需要调用introspect 端点并从中检索数据。

但RFC7662 section 2.2 表示,响应中实际上只有bool active 是必需的数据,其余的都是可选。

这里的“可选”到底是什么意思?

  • 该字段是可选的,如果为空则不存在,否则始终存在

或

  • 即使令牌具有关联的范围,它也可能会丢失
访问令牌不透明,没有自省端点?

我在 Auth0 论坛上发现 this 帖子解释了他们的不透明和 JWT 令牌。

Auth0 颁发的不透明访问令牌可与 /userinfo 端点一起使用以返回用户的个人资料。

和

为了接收 JWT,您必须在令牌请求中包含一个受众参数。

在这种情况下,我看不到任何获取范围的方法,因为它们不支持令牌自省。我在这里错过了什么?


因此,如果我的实现符合每个 OIDC IdP:

  • 如果是 JWT,请检查其中的作用域
  • 如果不是 JWT,请自省并检查响应中的范围
  • 如果不是 JWT 且没有自省端点,???

还有什么我需要知道/担心的吗?

【问题讨论】:

    标签: oauth-2.0 jwt access-token


    【解决方案1】:

    我认为您不应该以支持所有可能的 IdP 为目标,因为许多库期望并假定令牌使用 JWT 格式,并且如果您的 IdP 使用引用令牌而不是 JWT,则该令牌将不起作用。

    例如,对于 ASP.NET Core,用于身份验证的默认 JWT 库仅支持 JWT 令牌。

    通常,您构建的 API 只会验证和信任来自一个提供者的令牌,通常是您控制和拥有的那个(内部或作为服务)。

    如果您想支持社交登录,例如用户可以使用 Google 和 FaceBook 登录,那么这是通过您自己的 IdP 安排的,您的 IDP 将永远不会直接处理来自这些提供商的令牌。

    典型的设置如下所示

    【讨论】:

    • 我的 API 将由其他人自行托管,我想让它与他们将使用的任何 IdP 兼容——比如 Keycloak、Auth0 等,它应该可以正常工作。与此同时,我发现 Keycloak 不再让观众声称他们的访问令牌 - 他们说人们应该反省他们,所以......真的很有趣!谢谢!
    • 是的,这就是为什么用你自己的提供者保护你的 API 很好,这样你的 API 只信任来自你的 IdP 的令牌,并且 API 的令牌总是一致的
    猜你喜欢
    • 2013-04-30
    • 2021-09-10
    • 2021-03-17
    • 2016-04-24
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2016-09-18
    相关资源
    最近更新 更多