简单来说,OAuth就是一种授权机制,它能够为第三方应用提供访问用户资源的授权。
例如我们在玩某个游戏的时候需要获取QQ的好友列表,那么就需要遵循这个协议跟QQ服务器进行确认身份和协商,让游戏应用拿到允许获取QQ好友的一个令牌,然后游戏应用通过这个令牌就能够跟QQ服务器获取得到QQ好友列表。而这个令牌是有一个有效期的,过期就无法使用,这样就防止了令牌被滥用;当然这个令牌能获取到的数据也是有限的,他只能获取到你授权的内容,如果你只授权QQ好友的话,那么他是获取不到关于你QQ空间、QQ邮箱里面的内容的;而且当你不想玩这个游戏的时候还能够撤销这个令牌,让游戏无法再获取你的QQ好友列表。
也就是说通过OAuth授权第三方应用得到的令牌就是一个临时访问特定资源的凭证,值得注意的是只要拿到了令牌系统就不会再进行身份认证了,因此令牌必须保密,防止泄露导致数据被非法访问。目前一般的流程为先备案再授权,系统只会向有在本系统进行备案的应用颁发令牌,这样可以在一定程度上防止令牌被滥用。
一、授权方式
基于不同的场景,OAuth 2.0 有四种授权方式,分别为:
- 授权码(authorization-code)
- 隐藏式(implicit)
- 客户端凭证(client credentials)
- 密码式(password)
假设网站b要向网站a获取访问用户C的数据的令牌,在网站a进行备案之后即可开始权限获取,下文将通过图示对四种授权方式进行描述:
(一)授权码
最常用也是安全性最高的方式,一般授权码由前端获取,而令牌由后端获取,这样前后分离使得令牌不易泄露。
(二)隐藏式
适用于无后端的应用,安全性不高,只能用于对安全要求不高的场景,而且授权的令牌有效期一般较短。值得一提的是获取到令牌回调到原网站时,令牌存储位置采用的是锚点,由于oauth 2.0允许回调的网站是http的,因此存在中间人攻击的风险,但是采用锚点就有效减少了泄露的风险,毕竟浏览器跳转时锚点并不会发送到浏览器。
(三)客户端凭证
适用于没有前端的命令行应用。
(四)密码式
这种方式一般是在其他方式都无法采用的情况下才会采用的,用户必须高度信任该应用,毕竟需要将用户名和密码交出来,存在的风险非常大。
二、令牌的使用
网站b拿到了网站a的令牌之后,就可以向网站a提供的API发起请求获取数据了,令牌的位置一般是在数据包请求头,添加Authorization: xxxxxxxx
键值对。当令牌过期时,OAuth 2.0允许用户自动更新令牌,注意到前面获取到的 JSON 数据中含有refresh_token字段,这就是用于获取新令牌的字段,用户在令牌过期前用refresh_token向网站a发送请求更新令牌即可,一般格式为https://b.com/oauth/token?grant_type=refresh_token&client_id=CLIENT_ID&client_secret=CLIENT_SECRET&refresh_token=REFRESH_TOKEN
。
【参考】
https://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html
https://datatracker.ietf.org/doc/html/rfc6749
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 hututu1024@126.com