理解Oauth2的原理
一.OAuth是什么?
OAuth的英文全称是Open Authorization,一种开放授权协议
二.OAuth2.0有什么用?
第三方应用请求访问受保护资源时,资源服务器在获准资源用户授权后,会向第三方应用颁发一个访问令牌(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.授权码模式
用于第三方在用户授权下调取平台对外开放接口获取用户相关信息。
关键字:第三方,用户,平台,关系如下图。
例:
在第②,④,⑥,⑧步中,分别用到了云打印在微博平台上获得的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:指权限范围,可选,第④步中若已申请过某权限,此处可省略该参数
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”
}