授权码(authorization code) 方式,指的是第三方应用先申请一个授权码,然后再用该码获取令牌。
这种方式是最常用的流程,安全性也最高,它适用于那些有后端的 Web应用
适用场景:目前主流的第三方验证都是采用这种模式
主要流程:
1,进入授权页面
http://localhost:8080/oauth/authorize?client_id=clientapp&response_type=code&scope=read_userinfo&redirect_uri=http://localhost:9001/callback
如果没有登录,会跳到登录页面。登录完成后重新输入以上地址,进入用户授权页面。
2,获取code
用户选择拒绝,重定向到redirect_url地址
用户选择同意,重定向到redirect_url地址,并且在后面会带上返回code
http://localhost:9001/callback?code=xxx
3,根据code获取access_token
通过post请求如下url:
http://localhost:8080/oauth/token?grant_type=authorization_code&code=xxx&client_id=clientapp&client_secret=secret&scope=read_userinfo&redirect_uri=http://localhost:9001/callback
code使用完后销毁掉
返回access_token格式如下:
{
"access_token":"a8ae6a78-289d-4594-a421-9b56aa8f7213"
"token_type":"bearer",
"expires_in": 599,
"refresh_token":"ce3dd10e-ec60-4399-9076-ee2140b04a61",
"scope": "read userinfo"
}
4,客户端使用access_token访问资源
curl -H --request POST 'http://localhost:8080/api/orders'
--header 'Authorization: Bearer ACCESS_TOKEN'
5,刷新token
token过期后使用refresh_token刷新token再次使用
http://localhost:8080/oauth/token?grant_type=refresh_token&client_id=clientapp&client_secret=secret&refresh_token=ce3dd10e-ec60-4399-9076-ee2140b04a61
返回结果:
{
"access_token": "436423b4-fc22-4f41-8186-d8706ae9396f",
"token_type": "bearer",
"refresh_token": "225019af-4b2d-cd4e-820d-39417bc587af",
"expires_in": 1999,
"scope": "admin"
}
可以将access_token和refresh_token的过期时间保存下来,每次调用平台方的业务api前先对access_token和refresh_token进行一下时间判断,
如果过期则执行刷新access_token或重新授权操作。refersh_token如果过期就只能让用户重新授权。