简介
OAuth2.0是一种授权机制,主要核心是向第三方应用颁发令牌(token)。有四种授权方式:授权码,隐藏式,密码式,凭证式。
一. 授权码
指先向第三方应用申请一个授权码,然后再用该码获取令牌。
该方式最常用也最安全,适用于有后端的应用。授权码通过前端获取传送,后端获取存储令牌,并且与第三方的通信都通过后端完成。这样可以避免令牌泄露。
典型应用:第三方登录
1.应用A跳转到第三方应用B,B应用要求用户登录,并且询问是否授权给A应用,同意后,跳回A指定的回调地址,同时传回授权码。
//A应用跳转B应用的链接示例https://b.com/oauth/authorize? response_type=code& client_id=CLIENT_ID& redirect_uri=CALLBACK_URL& scope=read
/*
response_type参数表示要求返回授权码(code)
client_id参数让 B 知道是谁在请求
redirect_uri参数是 B 接受或拒绝请求后的跳转网址
scope参数表示要求的授权范围(这里是只读)
*/
//授权成功后,B回调A的示例
https://a.com/callback?code=AUTHORIZATION_CODE
2.A应用收到授权码后,后端向B应用请求令牌(token),示例如下:
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参数和client_secret参数用来让 B 确认 A 的身份
(client_secret参数是保密的,因此只能在后端发请求)grant_type参数的值是AUTHORIZATION_CODE,表示采用的授权方式是授权码code参数是上一步拿到的授权码
redirect_uri参数是令牌颁发后的回调网址
*/
3.B应用向A应用请求令牌的回调地址颁发令牌,requestBody示例如下:
{
"access_token":"ACCESS_TOKEN",
"token_type":"bearer",
"expires_in":2592000,
"refresh_token":"REFRESH_TOKEN",
"scope":"read",
"uid":100101,
"info":{...}
}
二. 隐藏式
允许直接向前端颁发令牌,这种方式没有授权码这个中间步骤,所以称为隐藏式。
适用于纯前端应用,不安全。示例如下,token是作为锚点,由于OAuth2.0允许跳转网址是Http协议,存在"中间人攻击"的风险,而锚点是不会发送到服务器的,所以减少了泄露令牌的风险。
https://a.com/callback#token=ACCESS_TOKEN
注:这种直接把令牌发送给前端的方式是很不安全的,因此只适用于一些安全性要求不高的场景,而且token的有效期必须非常短,通常是会话期间(session)有效。
三. 密码式
**指用户直接用B应用的密码在A应用上登录。**一般只适用于绝对信任的应用之间,如:同公司的不同应用。
四. 凭证式
适用于没有前端的纯后端应用。
A应用直接在命令行(或其他非前端方式)向B应用请求令牌,B应用验证通过后直接返回令牌。示例如下:
https://oauth.b.com/token?
grant_type=client_credentials&
client_id=CLIENT_ID&
client_secret=CLIENT_SECRET
/*
grant_type参数等于client_credentials表示采用凭证式
client_id和client_secret用来让 B 确认 A 的身份
*/
该方式颁发的令牌是针对应用,而非某个用户。