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

时间:2020-01-15 18:28:03

标签: oauth-2.0 jwt access-token openid-connect

据我所知,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 个答案:

答案 0 :(得分:3)

OpenID connect建立在OAuth2之上,并将ID令牌作为一项附加功能添加。 OpenID和OAuth2都没有说明访问令牌的格式(不必是JWT),因此您应该在问题中解释为什么您说它具有这种格式(即您是哪种OpenID提供程序(OP))使用)。访问令牌很容易成为授予存储在OP中的数据的不透明引用(例如,它也允许撤消访问)。

要提供最简单的答案,您可能无法简单地这样做,因为您的OP会拒绝该请求。 ID令牌的受众是客户端,而访问令牌的受众是OP。它们具有不同的用途,并且将进行不同的编码和验证。

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

客户端应用程序完全不需要知道访问令牌的内容或对其进行验证。仅当OP在project/build.sbt端点收到请求时,令牌才需要由OP理解和验证。