关于OAuth
出现的背景, 在上一篇OAuth1.0介绍 中已经写过了, 而2.0
的提出必然是为了解决1.0
中出现的问题. 感兴趣的可以去看看.
2.0
针对1.0
的问题提出了解决方案, 将协议升级为HTTPS
同时取消了secret
加密签名. 对非 web 应用也进行了支持.
OAuth
是什么呢? 在RFC 文档中是这样介绍的.
The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849.
写的比较官方哈, 简单说, 就是授权他人以拥有临时访问资源的权限.
先简单介绍授权过程中涉及到的几个角色:
在授权之前, 客户端需要先到服务器进行备案, 并拿到身份标识:
整个授权流程如下(截图自 RFC 文档):
其中各个步骤的简单说明:
其中的授权服务器和资源服务器只是概念上的拆分, 在实际中可以是同一个服务器(个人感觉这个拆分么的什么用呀).
整个过程使用HTTPS
协议进行通信. 其中3-6步, 只是简单的HTTPS
请求, 其中比较关键的部分就是用户如何同意授权.
在1.0
版本中, 用户的授权是到资源服务器登录并同意授权后, 再通过回调接口的方式通知客户端成功授权的. 当时存在的问题是对非 web 应用不友好. 而在2.0
版本中, 为了应对多种场景, 给出了四种不同的授权模式.
授权码模式就是客户端先拿到一个授权码, 然后使用授权码到授权服务器获取授权令牌. 与1.0
的授权方式差不多.
这里就不用 RFC 文档中的图了, 换一张我画的感觉更简洁一些.
看这个流程, 其实和1.0
版本的流程差不多. 对以上几步简单说明.
将用户引导到授权服务器进行授权操作.
携带参数
用户在授权服务器页面进行登录授权.
用户授权完成后, 授权服务器将页面重定向到第一步中的redirect_uri
, 通知客户端授权结果. 在进行跳转时会带上授权成功后的授权码.
用户成功授权并拿到授权凭证后, 想授权服务器申请access_token
.
携带参数
到这一步, 已经完成整个授权流程.
有些网站是纯前端的, 没有后端. 这种方式直接向前端颁发授权令牌, 省去了授权码这个步骤.
将用户引导到授权服务器进行授权操作.
携带参数
用户授权操作没有什么差别.
因为没有后端服务器, 因此授权成功后直接在重定向链接中带有授权 token. 链接形式: https://test.com/callback#token=ACCESS_TOKEN
注意, 这里access_token
是以锚点的形式拼在回调链接上的. 因为浏览器在访问的时候, 不会将锚点发送, 因此可以避免中间人攻击.
以这种方式获取的令牌往往授权时间比较短, 通常就是 session 期间有效.
这就是原始的版本了, 将你的用户名和密码直接告诉客户端, 然后客户端使用你的密码去申请令牌.
客户端获取 token 时携带的参数如下:
授权服务器校验后会返回授权令牌. 注意, 一般在第一步获取用户名和密码时, 客户端并不对其进行存储, 仅仅是在第二步获取授权时使用.
适用与没有交互界面的应用. 授权过程中没有用户参与, 客户端直接申请 token.
携带参数
授权服务器校验后直接返回access_token
. 看这个模式并不是OAuth
想要解决的问题啊, 看不懂为什么放在这里
OAuth2.0
允许在令牌过期后, 不经过用户进行令牌的更新. 授权服务器在颁发令牌时, 会同时颁发两个令牌: access_token
refresh_token
.
其中refresh_token
的过期时间要更久一些, 用于当access_token
过期后对其进行更新.