当前位置: 首页 > 知识库问答 >
问题:

与OIDC和访问令牌作用域混淆

韩靖琪
2023-03-14

我正在实现的API仅适用于具有特定范围、经典场景的用户。然而,我对访问令牌的一些事情并不了解。

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

但由于访问令牌格式未规范化,JWT可能包含任何内容。我应该假设每次都有范围吗?每个IdP都把他们放进去了吗?

我需要调用内省endpoint并从中检索数据。

但是RFC7662第2.2节说,实际上,响应中只有所需的数据是激活的,其余数据是可选的。

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

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

  • 即使令牌具有关联的作用域,它也可能丢失

我在Auth0论坛上找到了这篇文章,解释了他们的不透明和JWT令牌。

Auth0颁发的不透明访问令牌可与 /userinfoendpoint一起使用,以返回用户的配置文件。

为了接收JWT,您必须在令牌请求中包含访问群体参数。

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

因此,在我的实现符合每个OIDC IdP的情况下:

  • 如果是JWT,检查其中的作用域
  • 如果不是JWT,则内省它并检查响应中的范围
  • 如果不是JWT并且没有自省endpoint,???

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

共有1个答案

罗学林
2023-03-14

我认为您不应该旨在支持每一个可能的IdP,因为许多库期望并假设令牌使用JWT格式,如果您的IdP使用引用令牌而不是JWT,那么它将不起作用。

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

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

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

典型的设置如下所示

 类似资料:
  • 我想使用谷歌作为OIDC协议的id提供商。我有一个简单的应用程序。它启动,正确地重定向到谷歌,然后返回到应用程序,打印用户详细信息并将其存储在会话中。但是,这种身份验证似乎来自id令牌,并且只有1h的过期时间 我的YML:

  • 我不熟悉,它代表。我混淆了它的两个术语:访问令牌和刷新令牌。 用户注册/登录站点后,我创建和。 将刷新标记保存在数据库或cookie中。 15分钟后,用户标记访问令牌过期。 如果用户空闲2小时,我将从cookie或DB中删除刷新令牌,否则我将使用刷新令牌续订访问令牌。 有什么优化的方法可以达到这个目的吗?

  • 我已经阅读了JWT和访问令牌和刷新令牌。我知道您必须在很短的时间(分钟)内设置访问令牌过期,并在过期时使用刷新令牌获取新的访问令牌。 我不清楚三件事: 谁检查访问令牌是否过期?客户端是否通过发送过期的访问令牌和刷新来检查并请求新的访问代码? 谁检查刷新令牌是否过期?(显然刷新令牌也需要过期,尽管需要更长的时间才能过期)。 在我看来,如果刷新令牌过期,则必须提示用户重新登录。在某些情况下(移动应用)

  • 我目前正在尝试使用ADFS 2016认证angular 7应用程序(使用angular-oauth2-oidc)。到目前为止,它工作得很好。当我访问应用程序时,我被重定向到ADFS登录页面,在那里输入我的凭据并获得令牌。 现在,当应用程序调用web API时,它在请求头中发送访问令牌。ADFS返回的访问令牌如下所示: 问题是web API必须知道进行调用的用户的ID(因为在应用程序级别定义了一些权

  • 我目前正在使用多个Quarkus服务和Keycloak RBAC开发一个PoC。工作起来就像一个魅力,很容易引导和开始实现功能。 但我遇到了一个我无法解决的问题。想象一下: null 使JWT的持续时间超过当前的30分钟,但这只是推迟了问题并打开了一些安全门 将用户的输入存储在本地存储器中,以便在令牌刷新后进行恢复(我们也会这样做,以避免浪费用户的工作) 在JS中“静默”刷新令牌,而不让用户知道。

  • 这是我的身份验证流程: 用户登录后收到两个令牌(具有过期时间的访问令牌和没有过期时间的刷新令牌) 对于每个用户,刷新令牌存储在数据库中名为refreshTokens的json列中(这是一个数组) 在客户端,访问令牌和刷新令牌都存储在本地存储器上 当需要验证用户时,如果访问令牌过期,将使用刷新令牌创建一个新的访问令牌,并将其发送回用户并保持用户登录 当用户注销时,数据库中存储的刷新令牌(在refre