一.OAuth是什么?
OAuth的英文全称是Open Authorization,它是一种开放授权协议。OAuth目前共有2个版本,2007年12月的1.0版(之后有一个修正版1.0a)和2010年4月的2.0版,1.0版本存在严重安全漏洞,而2.0版解决了该问题,下面简单谈一下我对OAuth2.0的理解。
二.OAuth2.0有什么用?
引用一下OAuth2.0中文文档中的介绍:
1.需要第三方应用存储资源所有者的凭据,以供将来使用,通常是明文密码。
2.需要服务器支持密码身份认证,尽管密码认证天生就有安全缺陷。
3.第三方应用获得的资源所有者的受保护资源的访问权限过于宽泛,从而导致资源所有者失去对资源使用时限或使用范围的控制。
4.资源所有者不能仅撤销某个第三方的访问权限而不影响其它,并且,资源所有者只有通过改变第三方的密码,才能单独撤销这第三方的访问权限。
5.与任何第三方应用的让步导致对终端用户的密码及该密码所保护的所有数据的让步。
简单概括,就是用于第三方在用户授权下调取平台对外开放接口获取用户相关信息。
OAuth引入了一个授权环节来解决上述问题。第三方应用请求访问受保护资源时,资源服务器在获准资源用户授权后,会向第三方应用颁发一个访问令牌(AccessToken)。该访问令牌包含资源用户的授权访问范围、授权有效期等关键属性。第三方应用在后续资源访问过程中需要一直持有该令牌,直到用户主动结束该次授权或者令牌自动过期。
三.OAuth2.0有哪几种授权模式?
授权码模式(Authorization Code)(正统方式)(支持refresh token)
授权码简化模式(Implicit)(为web浏览器设计)(不支持refresh token)
Pwd模式(Resource Owner Password Credentials) (基本不用)(支持refresh token)
Client模式(Client Credentials) (为后台api调用设计)(不支持refresh token)
扩展模式(Extension)(自定义模式,这个就不介绍了)
1.授权码模式(第四小结详解,此处略过)
2.授权码简化模式
授权访问:
http://localhost:8080/oauth2/oauth/authorize? response_type=token&client_id=testid&redirect_uri=http://localhost/OAuth&scope=read
之后接受访问,该页面将被重定向到重定向URI并带有令牌:
http://localhost/OAuth/#access_token=KCIS89HFUE7SGE62&token_type=bearer&expires_in=3600
3.Pwd模式
请求格式:
POST -D "&grant_type=password&username=babala&password=kkk1234&scope=read,write"
http://localhost/oauth/token
服务器返回来的访问令牌:
{
"access_token":"9cd23bef-ae56-46b0-82f5-b9a8f78da569",
"token_type" : "bearer" ,
"expires_in" : 43199 ,
"scope" : "read"
}
4.Client模式
请求格式:
POST -D "&client_id=appid&grant_type=client_credentials&client_secret=appkey" http://localhost/OAuth/token
服务器返回来的访问令牌:
{
"access_token":"4e56e9ec-2f8e-46b4-88b1-5d06847909ad",
"token_type": "bearer” ,
"refresh_token":"7e14c979-7039-49d0-9c5d-854efe7f5b38",
"expires_in": 36133 ,
"scope": "read,write"
}
四.详解OAuth2.0的授权码简化模式?
简单概括,就是用于第三方在用户授权下调取平台对外开放接口获取用户相关信息。
有三个关键字:第三方,用户,平台,关系如下图。
看起来很简单对吧,其实授权的部分,要比上图展示的复杂一丢丢,下面来讲解一下授权的部分。
首先,有个问题,就拿微博平台来说吧,不能说随便一个第三方过来要求申请用户资源,微博平台就去用户那问一句是否授予权限吧,微博大哥能这么随便?所以第三方需要去想要请求的接口所在平台去报备一下,也就是告诉平台:我的xxx地址想要申请使用你的接口,可以吗?等平台审核通过之后,会下发一组appid+appkey,第三方持凭此就有资格去请求该平台的接口了。
第三方的准备工作做好了,下面就是具体运作流程了。(各大平台大多使用授权码模式——Authorization Code,因为它相比其它几种模式更为严谨,这里我仅分析一下该模式的原理)
这里我们假设一个场景,就是想用‘云打印’来打印自己‘微博的关注列表’。
简图如下:
详图如下:
在第②,④,⑥,⑧步中,分别用到了云打印在微博平台上获得的appid+appkey。关于每一步请求所需要的一系列参数这里就不一一列举了,官方文档非常详细,这里仅说明一下请求code和请求access token时重要的参数。
第④步参数:
response_type:指授权类型,必选,这里填固定值‘code’
client_id:指客户端id,必选,这里填在平台报备时获取的appid
redirect_uri:指重定向URI,可选
scope:指申请的权限范围,可选
state:指客户端当前状态,可选,若填了,则认证服务器会原样返回该值
第⑥步参数:
grant_type:指使用哪种授权模式,必选,这里填固定值‘authorization_code’
code:指从第⑤步获取的code,必选
redirect_uri:指重定向URI,必选,这个值需要和第④步中的redirect_uri保持一致
client_id:指客户端id,必选,这里填在平台报备时获取的appid
client_secret:指客户端密钥,必选,这里填在平台报备时获取的appkey
第⑧步参数:
access_token:指访问令牌,必选,这里填第⑦步获取的access_token
token_type:指令牌类型,必选,大小写不敏感,bearer类型 / mac类型
expires_in:指过期时间,单位秒,当其他地方已设置过期时间,此处可省略该参数
refresh_token:指更新令牌,可选,用即将过期token换取新token
scope:指权限范围,可选,第④步中若已申请过某权限,此处可省略该参数
到这里,OAuth2.0 授权码模式的认证过程就完成了,原理还算比较简单,就是较为繁琐,但是不算难。
注意:1.code时效较短,多为10s-10min,每次获得的code仅可使用一次,且code与client_id和redirect_uri有 一一对应关系。
2.access token 有过期时间,多为10-15天。(过期处理有2种,请求用户重新授权/refreshToken,一般多用重新授权。)
3.在请求时,参数中包含重定向地址的,需要和第三方在授权方平台报备时留的地址前部一致
4.关于token_type的两种类型有什么区别,有个博客写的很详细,推荐阅读:www.cnblogs.com/XiongMaoMengNan/p/6785155.html
此处奉上找了好久才找到的OAuth2 RFC6749中文翻译:http://colobu.com/2017/04/28/oauth2-rfc6749/
本人能力有限,错误之处,敬请指正。