diff --git a/docs/protocols/openid.md b/docs/protocols/openid.md index 125b2b917..3f0307820 100644 --- a/docs/protocols/openid.md +++ b/docs/protocols/openid.md @@ -62,20 +62,31 @@ OAuth2中还有口令模式和“应有访问模式”的方式来获取Access T 和OAuth认证流程类似 RP发送一个认证请求给OP,其中附带client_id; + OP对EU进行身份认证; + OP返回响应,发送授权码给RP; + RP使用授权码向OP索要ID-Token和Access-Token,RP验证无误后返回给RP; + RP使用Access-Token发送一个请求到UserInfo EndPoint; UserInfo EndPoint返回EU的Claims。 + +
GET /authorize?
response_type=code
&scope=openid%20profile%20email
@@ -83,16 +94,18 @@ GET /authorize?
&state=af0ifjsldkj
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb HTTP/1.1
Host: server.example.com
+
HTTP/1.1 302 Found
Location: https://client.example.org/cb?
code=SplxlOBeZQQYbYS6WxSbIA
&state=af0ifjsldkj
+
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
@@ -114,21 +127,33 @@ RP使用上一步获得的code来请求Token EndPoint,这一步桶OAuth2,就
K5hoDalrcvRYLSrQAZZKflyuVCyixEoV9GfNQC3_osjzw2PAithfubEEBLuVVk4
XUVrWOLrLl0nx7RkKU8NXNHq-rvKMzqg"
}
+
其中看起来一堆乱码的部分就是JWT格式的ID-Token。在RP拿到这些信息之后,需要对id_token以及access_token进行验证(具体的规则参见http://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation和http://openid.net/specs/openid-connect-core-1_0.html#ImplicitTokenValidation)。至此,可以说用户身份认证就可以完成了,后续可以根据UserInfo EndPoint获取更完整的信息。
{
"iss": "https://server.example.com",
"sub": "24400320",
@@ -139,6 +164,7 @@ azp = Authorized party:可选。结合aud使用。只有在被认证的一方
"auth_time": 1311280969,
"acr": "urn:mace:incommon:iap:silver"
}
+
另外ID Token必须使用JWT(JSON Web Token)进行签名和JWE(JSON Web Encryption)加密,从而提供认证的完整性、不可否认性以及可选的保密性。关于JWT的更多内容,请参看JSON Web Token - 在Web应用间安全地传递信息
GET /userinfo HTTP/1.1
Host: server.example.com
Authorization: Bearer SlAV32hkKG
+
成功之后响应如下:
-
+
HTTP/1.1 200 OK
Content-Type: application/json
@@ -178,4 +205,5 @@ UserInfo Endpoint
"email": "janedoe@example.com",
"picture": "http://example.com/janedoe/me.jpg"
}
+
其中sub代表EU的唯一标识,这个claim是必须的,其他的都是可选的。
\ No newline at end of file