OAuth 2.0
规范来自 RFC6749。看了《Spring 微服务实战》对OAuth 2.0 的介绍后还是觉得存在一些翻译的问题。现在结合RFC6749
一起重新梳理下。
o-stock
实现获取微信头像。Oauth2.0
知识点进行梳理和理解。o-stock
(对应Oauth2.0
中的client
)RFC6749 定义 OAuth 2.0 目前只建立在HTTP协议上。并多次提到user-agen
可以交给浏览器扮演,授权码模式十分适合有独立服务器的Web 服务器。
从 o-stock
来看
o-stock
注册,但是或许有使用微信登录的冲动。从微信
的角度看
authorization server
和 resource server
的角色,有不少io的开销。从行业规范看
authorization server
不可能给所有o-stock
提供三方登录的功能,那么就要要求o-stock
要在微信的 authorization server
上注册o-stock
不能保存用户的微信密码,取而代之的由是 authorization server
向 o-stock
颁发 code
。o-stock
需要在微信的 authorization server
持有登录凭证(要让 authorization server
认识自己),带上code和登录客户端登录凭证,请求 authorization server
后可以获取access_token
access_token
是代替微信密码的最终产物,这个令牌可以在o-stock
保存,o-stock
可用于获取用户头像。RFC6749
未交代的前置因素拉文档里的图,现在把user-agen
当作浏览器
+----------+
| Resource |
| Owner |
| |
+----------+
^
|
(B)
+----|-----+ Client Identifier +---------------+
| -+----(A)-- & Redirection URI ---->| |
| User- | | Authorization |
| Agent -+----(B)-- User authenticates --->| Server |
| | | |
| -+----(C)-- Authorization Code ---<| |
+-|----|---+ +---------------+
| | ^ v
(A) (C) | |
| | | |
^ v | |
+---------+ | |
| |>---(D)-- Authorization Code ---------' |
| Client | & Redirection URI |
| | |
| |<---(E)----- Access Token -------------------'
+---------+ (w/ Optional Refresh Token)
Note: The lines illustrating steps (A), (B), and (C) are broken into
two parts as they pass through the user-agent.
Figure 3: Authorization Code Flow
Note: RFC6749
并没有规范黑色线的具体实现,但是规定了红色线提交参数的具体要求
授权请求:(/authorize 是微信端的url)
GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
Host: server.example.com
授权响应:(微信感知到用户同意授权,借浏览器重定向的能力向服务器颁发code)
HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz
授权令牌请求:
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
也就是上文第一幅图给出的微信token, 这个需要o-stock
自己存储维护。网上很多资料都说要携带client_id
和 client_secret
,但是官网的这份代码明显没有。原因是czZCaGRSa3F0MzpnWDFmQmF0M2JW 已经能让微信识别出该请求是o-stock
发起的,并且规范中也说明了授权码模式,client在已认证的情况下可以不提供client_id
,更不用说client_secret
授权令牌响应:
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value"
}
令牌续期:
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
至此,RFC6749
的授权流程已经交代完了。使用access_token
去微信的 resource server
就能获取头像了。整个授权流程其实可以不包含resource server
,resource server
后续可以跟o-stock
打交道。o-stock
可以存储access_token
。在基于Oauth2.0
之上又拓展了一种OIDC
用于增强认证流程(RFC6749
并没有交代认证流程),该规范可以实现单点登录,此时o-stock
存储OIDC
规范下的id_token
不失为一种更好的实现,后续搞清楚了思想再写一篇单点登录的博客记录一下。