2018/04/14 理解oAuth2.0

时间:2023-12-22 11:06:44

最近都近没有更新博客了,卡在 oAuth 上了。

之前公司做统一身份的认证,不了解 oAuth 的我在这卡了两天。

于是决定仔细研究原理,理论指导实践。

--

什么是 oAuth ?

简单来说 oAuth 是一种认证方式,现在普遍用于第三方的认证,比如 QQ ,微博 等实现的第三方接入。

--

oAuth 流程?

首先推荐阮老师的教程:理解OAuth 2.0

这里我只是说明一个我对 oAuth 过程的理解,具体的阮老师真的说的非常好。

这里首先贴出一张图,摘自阮老师微博,摘自RFC 6749。

2018/04/14 理解oAuth2.0

我理解的 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 的流程在去练习,否则真的会把你搞蒙。