标准
rfc6749The OAuth 2.0 Authorization Framework (RFC )https://tools.ietf.org/html/rfc6749
是什么
OAuth 2.0 授权框架使得第三方可以获取对用户资源的访问(有限访问或者完全访问)。
举个例子:通过你的允许,bilibili 可以去微信服务器获取你的头像,昵称,openid 等等。
为什么
传统授权方式,用户和第三方共享密码。缺点如下:
- 未来可能持续需要访问各种受限资源。所以第三方要存储用户密码,一般情况密码是明文,显然不安全。
- 第三方将可以访问所有的资源,而实际上它只应当有权限访问部分资源。
- 用户不能撤销单个第三方的访问权限。改密码,所有第三方都会失效。
术语
案例:用户通过“微信登陆”登陆 bilibili 。
专业称呼 | 通俗叫法 |
---|---|
资源所有者 | 用户 |
资源服务器 | 保存用户信息的服务器并且能够验证令牌是否合法(比如说,微信服务器,保存你的微信头像等) |
客户端 | 第三方应用程序(比如说,bilibili) |
授权服务器 | 发送令牌给第三方的服务器(可以和资源服务器是同一个) |
授权码模式(适用前后端分离)
最常用的模式,微信、QQ、Github 登陆第三方网站就是这种模式。优点前后端分离,避免令牌泄露。
- 哔哩哔哩提供一个“微信登陆”的链接,用户点击跳转到微信授权服务器。
- 用户根据微信授权服务器提示登陆微信并确认授权给哔哩哔哩。
- 微信授权服务器返回用户代理(浏览器)一个授权码。
- 用户代理(浏览器)把这个授权码传给哔哩哔哩。
- 哔哩哔哩凭借授权码向微信授权服务器请求令牌。
- 微信授权服务器发送令牌给哔哩哔哩。
之后哔哩哔哩就可以带着令牌去微信资源服务器读取用户资料。
三个问题:
- 为什么要有授权码?
- 为什么要重定向?
- 授权码为什么不直接返回给 bilibili ?
隐式模式(不推荐使用)(适合没有后台的第三方)
- 哔哩哔哩提供一个“微信登陆”的链接,用户点击跳转到微信授权服务器。
- 用户根据微信授权服务器提示登陆微信并确认授权给哔哩哔哩。
- 微信授权服务器发送令牌给哔哩哔哩。
https://weixin.com/oauth/authorize?
response_type=token&
client_id=123&
redirect_uri=http://www.bilibili.com/callback&
scope=read
密码模式(适合用户极其信任第三方)
- 哔哩哔哩使用用户给的微信登陆账号和密码直接向微信授权服务器索要令牌。
- 微信授权服务器发送令牌给哔哩哔哩。
https://weixin.com/token?
grant_type=password&
username=张三&
password=123456&
client_id=123
客户端模式(适合没有前端的第三方,整个过程没有用户参与)
- 哔哩哔哩向微信授权服务器请求令牌。
- 微信授权服务器发送令牌给哔哩哔哩。
https://weixin.com/token?
grant_type=client_credentials&
client_id=123&
client_secret=xxxxx