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

访问令牌和用户ID

毕宏盛
2023-03-14

我目前正在尝试使用ADFS 2016认证angular 7应用程序(使用angular-oauth2-oidc)。到目前为止,它工作得很好。当我访问应用程序时,我被重定向到ADFS登录页面,在那里输入我的凭据并获得令牌。

现在,当应用程序调用web API时,它在请求头中发送访问令牌。ADFS返回的访问令牌如下所示:

{
  "aud": "microsoft:identityserver:xxx",
  "iss": "http://xxx/adfs/services/trust",
  "iat": 1554561406,
  "nbf": 1554561406,
  "exp": 1554565006,
  "apptype": "Public",
  "appid": "xxx",
  "authmethod": "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport",
  "auth_time": "2019-04-06T12:21:39.222Z",
  "ver": "1.0",
  "scp": "profile openid"
}

问题是web API必须知道进行调用的用户的ID(因为在应用程序级别定义了一些权限)。我在这里看到,我可以向访问令牌添加声明,我做到了。然而,当我在互联网上阅读文章时,我读到访问令牌显然不应该用于标识用户,所以我不知道添加web API用于标识用户的声明是否正确。

然而,我在这里读到

访问令牌拥有的唯一用户信息是位于子声明中的用户ID。

但默认情况下,ADFS 不提供“子”令牌。如果我自己添加包含用户电子邮件地址的“sub”声明是否正确,或者我必须以不同的方式继续?

共有1个答案

卫胜
2023-03-14

是的,访问令牌不应该用于标识用户。但是,如果您可以在访问令牌中获取用户标识符,这就是您需要了解的关于用户的所有信息,那么这可能是最简单的方法。但它是特定于您的身份验证服务器的实现。

标准的方法是请求< code>profile作用域(您这样做了)并从< code>userinfoendpoint获取信息(参见OpenID Connect RFC)。如果使用这种方式,您可能希望缓存响应,这样就不需要对每个客户端请求都进行这个HTTP调用

如果您的后端API仅由Angular应用程序使用,并且不应该由第三方调用,那么您也可以考虑将后端用作OAuth2客户端,该客户端接收授权代码并将其交换为ID令牌。然后,它可以在一个会话中保存用户的身份(从ID令牌中读取),并发出一个标识该会话的cookie。所以前端不需要对每个请求都发送一个令牌。这将使后端有状态,但它可能更容易实现。

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

  • 我正在使用Haughin的Twitter Codeigniter API使用twitter登录。现在我需要能够代表用户发布推文。问题是,我首先需要找到并获取用户的访问令牌和用户的秘密,并将它们存储在我的数据库中以备后用。一旦我连接到twitter,我在哪里找到这些? 谢谢

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

  • null 很抱歉太啰嗦了。 提前谢了。

  • 使用KeyCloak时,访问令牌与用户信息令牌有何不同? 从OAuth2/OpenIDConnect中,我了解到访问令牌提供了用户已经通过身份验证的信息,您需要使用用户信息令牌来获取关于用户及其配置文件/角色等的更多信息。 当我看到访问令牌时https://jwt.io/而不是用户信息令牌。我能够获得与用户配置文件相同的信息 为什么会这样,使用Keycloak时访问令牌与用户信息令牌有何不同?

  • 我有一个Keycloak(独立)V1.9.4。最后在AWS实例上使用Wildfly 10安装安装程序,并尝试使用Keycloak(通过Keycloak的登录页面)和Twitter4j来验证Twitter用户,然后明显地让我的应用程序验证并查看用户的时间线等。 我已经配置了身份提供程序(Twitter)、领域和我的客户端应用程序。 我还在apps.Twitter.com上设置了一个Twitter应用