最近都近没有更新博客了,卡在 oAuth 上了。
之前公司做统一身份的认证,不了解 oAuth 的我在这卡了两天。
于是决定仔细研究原理,理论指导实践。
--
什么是 oAuth ?
简单来说 oAuth 是一种认证方式,现在普遍用于第三方的认证,比如 QQ ,微博 等实现的第三方接入。
--
oAuth 流程?
首先推荐阮老师的教程:理解OAuth 2.0
这里我只是说明一个我对 oAuth 过程的理解,具体的阮老师真的说的非常好。
这里首先贴出一张图,摘自阮老师微博,摘自RFC 6749。
我理解的 oAuth 具体分这几步骤!
1:客户端发起认证请求【为了拿到code,做下一步的认证请求准备】
理解:当你使用一个 QQ/微信 登录一个客户端时候,客户端会发起一个请求去 QQ/微信 的服务端发起第三方认证请求。
下面是阮老师博客中一个例子
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
具体解释下这个 GET 请求中具体的参数意义
response_type:表示授权类型,必选项,此处的值固定为"code"
client_id:表示客户端的ID,必选项
redirect_uri:表示重定向URI,服务端处理之后的数据会返回这个URL
scope:表示申请的权限范围,可选项
state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
2:服务端认证请求,通过返回 code【为了让客户端使用code来换Token】
注意:为了保证安全,这个 code 的生命周期很短,时间根据服务端来指定。
HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
&state=xyz
3:客户端使用获取到的 code 换取 Token(令牌)【为了获取Token来使用服务】
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
具体解释下这个 POST 请求中具体的参数意义
grant_type:表示使用的授权模式,必选项,此处的值固定为"authorization_code"。
code:表示上一步获得的授权码,必选项。
redirect_uri:表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致。
client_id:表示客户端ID,必选项。
4:服务端返回 Token 用于第三方使用【为了让客户端使用Token来调用对应的服务】
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"
}
5:客户端拿到了 access_token ,就可以使用服务端提供的服务了
--
这里只讲解了一种正常的 oAuth 流程,oAuth 的知识远远不止这一点,需要的话还可以更深入的学习。
一定要知道 oAuth 的流程在去练习,否则真的会把你搞蒙。