openID Connect如何真正验证用户身份?

时间:2017-07-11 01:10:09

标签: oauth-2.0 openid-connect

根据我的理解,从OAuth到OpenID Connect的区别在于,当客户端访问OAuth的/ token端点时,OAuth会响应以下内容:

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache

{
   "access_token": "SlAV32hkKG",
   "token_type": "Bearer",
   "refresh_token": "8xLOxBtZp8",
   "expires_in": 3600,
   "id_token": "e134j23jk432j"
}

我在阅读文档的印象中,ID令牌包含一个身份验证类型,表示用户是否通过输入密码来通过授权。因此,这将验证用户是否进行了身份验证,而不仅仅是授权。我还不清楚如何使用令牌来验证这一点。

我的理解是id_token对客户端不透明,所以客户是否有一种标准的信息解释方式?

此外,我在5. Definitions of Multiple-Valued Response Type Combinations async/await下找到的文档显示了对id_token进行/授权的示例请求。不应该在/ token?

获得id_token

1 个答案:

答案 0 :(得分:0)

  

我的理解是id_token对客户端不透明

所以这是你需要澄清的地方。 Id令牌是JWT(rfc7519),必须由客户端验证。

请注意,此处的“客户”是依赖方。例如,它是一个网站。此客户端依赖于在openid提供程序(授权服务器,如rfc6749中所述)中完成的授权,并使用响应中的 id token 来验证“最终用户”。

从文档中引用,

  

OpenID Connect对OAuth 2.0进行身份验证的最终用户的主要扩展是ID令牌数据结构。 ID令牌是一种安全令牌,其中包含授权服务器在使用客户端时对最终用户的身份验证的声明,以及可能的其他请求的声明。 ID令牌表示为JSON Web令牌(JWT)

现在,回到问题。如何阅读和理解JWT并使用它来验证用户身份。 JWT的规范在这里 - rfc7519。它基本上包含以下格式的三个部分,

<强> H.C.S

H(标题) - 包含类型和算法以及其他元信息

C(JWT声明) - 包含有关授权用户的声明

S(JWS签名rfc7515 - 基本上是用于验证标题和声明的MAC

这些部分中的每一部分都是base64url编码的。请注意,JWS由令牌颁发者签名。

从文档中引用

  

ID令牌必须使用JWS [JWS]进行签名,并且可选地分别使用JWS [JWS]和JWE [JWE]进行签名和加密,从而根据第16.14节提供身份验证,完整性,不可否认性和可选的机密性

需要在 id token 中验证哪些内容,specification提及您需要执行的操作。

希望这能澄清您对JWT的疑问以及它如何用于验证“最终用户”

  

不应该在/ token获取id_token吗?

这取决于您使用的流量。例如,implicit flow允许您在授权响应中获取id令牌。

p.s - 要查看id令牌的内容,您可以使用https://jwt.io/中的调试器功能