我的个人网站:
http://riun.xyz
简介
OAuth2.0 是授权机制,用来授权第三方应用,获取用户数据。
比如在某些博客网站下方的评论区,经常看到需要使用github登陆然后才能评论,这就使用了OAuth的授权机制。这里我们把博客网站叫做【第三方应用】,把github叫做【用户数据所有者】,把使用github登陆然后才能跳转到博客网站进行评论叫做【授权】。 用户想要在博客网站的评论区进行评论,那我首先得要知道你是谁才能让你评论吧,但是我又没有你的数据,而且我只是需要知道你是谁,显示你的信息就行了,所以我也不必单独再做一个用户登陆系统,那索性我就去别的地方拿你的信息咯,所以我就让你跳转到github的登陆页面,登陆后显示出请求授权该网站的按钮,如果你同意并点击了,那么博客网站就能从github中拿到你的用户信息数据,再跳转到博客页面,你就可以评论了。评论后显示的用户名啊,头像啊这些东西都是从github中拿到的。
引用阮一峰的OAuth教程中的一句话:简单说,OAuth 就是一种授权机制。数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用。
令牌与密码的区别:
令牌 | 密码 |
---|---|
短期,自动失效 | 长期,用户不修改就不变 |
可以被撤销,然后立即失效 | |
有权限范围 | 完整权限 |
由于令牌相当于短期的密码,在固定的时间、权限范围内可读(或写)数据,所以令牌也是不能泄露的。这也是为什么令牌生效时间设置的很短的原因。
授权方式
OAuth的目的就是颁发令牌,第三方网站通过令牌可以去用户数据所有者取数据。下面介绍下四种授权方式,即四种获取令牌的流程。
- 授权码(authorization-code)
- 隐藏式(implicit)
- 密码式(password):
- 客户端凭证(client credentials)
不管那种方式,都必须先到第三方网站备案,说明自己的身份。
下面只讲解授权码的方式。具体四种方式,请参考:阮一峰的博客
授权码的方式:
下面将博客网站作为A网站,github作为B网站。
A网站提供一个链接:
https://b.com/oauth/authorize?
response_type=code&
client_id=CLIENT_ID&
redirect_uri=CALLBACK_URL&
scope=read
# response_type 要求返回授权码
# client_id 是实现向B网站备案时,B提供给A的唯一确定身份的码。必须显式给出
# redirect_uri B网站接收或拒绝后跳转的网址。必须显式给出
# scope 授权范围
用户点击后跳到B网站的登陆页面,并询问是否同意授权A网站获取信息。当用户同意或拒绝后就会跳到到redirect_uri=CALLBACK_URL
里提供的url
如果同意授权,跳回时,会返回一个授权码:
https://a.com/callback?code=AUTHORIZATION_CODE
# code 授权码
然后A网站在后端收到请求后,就可以在后端向B网站请求令牌,
https://b.com/oauth/token?
client_id=CLIENT_ID&
client_secret=CLIENT_SECRET&
grant_type=authorization_code&
code=AUTHORIZATION_CODE&
redirect_uri=CALLBACK_URL
# client_id 客户端ID,同上。必须显式给出
# client_secret 客户端密钥,和client_id获取方式一样,不过是保密的。必须显式给出
# grant_type=authorization_code 表示是授权码的方式获取令牌
# code 上一步获取的授权码。必须显式给出
# redirect_uri 获取令牌后,B网站向此地址发送令牌相关信息
B网站收到获取令牌的请求,检查参数正确后,就会颁发令牌:向 redirect_uri 的地址发送一段json数据
{
"access_token":"ACCESS_TOKEN",
"token_type":"bearer",
"expires_in":2592000,
"refresh_token":"REFRESH_TOKEN",
"scope":"read",
"uid":100101,
"info":{...}
}
# access_token 就是令牌
A网站在后端拿到,就可以向B网站的API请求数据。 每个发到 API 的请求,都必须带有令牌。 具体做法是在请求的头信息,加上一个Authorization
字段,存放令牌信息。
curl -H "Authorization: Bearer ACCESS_TOKEN" \
"https://api.b.com"
# ACCESS_TOKEN 就是令牌
图:
来源:阮一峰的博客
demo
目的:利用OAuth授权完成第三方登陆,最终获取第三方储存的用户数据。
小demo: http://www.ruanyifeng.com/blog/2019/04/github-oauth.html
内容是,利用github登陆授权后获取用户信息进行展示。