我们可以使用 ID 令牌作为访问令牌吗?

Posted

技术标签:

【中文标题】我们可以使用 ID 令牌作为访问令牌吗?【英文标题】:can we use ID Token as an Access Token? 【发布时间】:2020-05-02 13:58:58 【问题描述】:

据我所知,ID 令牌如下所示:


  "iss": "http://YOUR_DOMAIN/",
  "sub": "authentication",
  "aud": "clien id",
  "exp": 1512285980,
  "iat": 1512280980,
  "name": "omid",
  "given_name": "omid",
  "family_name": "haghighatgoo",
  "gender": "male",
  "birthdate": "1987-10-31",
  "email": "a@b.com",


访问令牌是这样的:


  "iss": "https://YOUR_DOMAIN/",
  "sub": "authentication",
  "aud": [
    "api-identifier",
    "https://YOUR_DOMAIN/userinfo"
  ],
  "azp": "clientid",
  "exp": 1512285980,
  "iat": 1512280980,
  "scope": "profile email"

很明显,访问令牌中的所有参数也可以在 id 令牌中。那么为什么我们不应该使用 id 令牌作为访问令牌呢?我的意思是,如果使用 JWT,它们都可以由一个令牌处理。

【问题讨论】:

【参考方案1】:

OpenID 连接建立在 OAuth2 之上,并将 ID 令牌添加为一项额外功能。 OpenID 和 OAuth2 都没有说明访问令牌的格式应该是什么(它不一定是 JWT),所以你应该在你的问题中解释为什么你说它有这种格式(即你是哪个 OpenID 提供者(OP)使用)。访问令牌可以很容易地成为存储在 OP 上的授权数据的不透明引用(例如,它还允许撤销访问)。

为了提供最简单的答案,您可能不能这样做,因为如果您这样做,您的 OP 会拒绝该请求。 ID 令牌的受众是客户端,而访问令牌的受众是 OP。它们服务于不同的目的,并且会以不同的方式进行编码和验证。

ID 令牌是客户端应用程序告诉它经过身份验证的用户是谁的信息。它可能会使用非对称算法进行签名,以便客户端可以验证它是由 OP 发出的。

客户端应用根本不需要知道访问令牌的内容或验证它。只有当 OP 在userinfo 端点收到请求时,令牌才需要被理解和验证。

【讨论】:

以上是关于我们可以使用 ID 令牌作为访问令牌吗?的主要内容,如果未能解决你的问题,请参考以下文章

Id 令牌与访问令牌

我们可以在 MFP 上注销后使旧的访问令牌失效吗?

我们应该与访问令牌一起更新刷新令牌吗?

我可以使用可撤销令牌访问 Facebook Audience Network API 吗?

如何从刷新令牌中获取访问令牌?刷新令牌会过期吗?

JWT 访问令牌:矛盾?