一、 为什么会有OAuth?
举个例子(举例而已并不真实)
有一个运动软件,可以将微信好友运动量的排行。而用户为了使用此功能必须授权运动软件读取微信好友列表。
那怎么让运动软件怎么获取用户的同意呢?
我们可以将微信的账号和密码告诉这个运动软件,运动软件就可以读取微信好友列表了。
但我们很明显能发现这种方法有很大问题:
- 很不安全。运动软件需要经常性获取好友列表,所以会一直保存账号密码;
- 而运动软件也可以获得微信的其他权限;
- 如果运动软件被攻击导致破解会使得密码泄露;
- 而用户想收回权限的时候,只有通过修改密码实现,同时也会导致其他被授权的软件不能使用。
所以才有了OAuth。
二、 什么是OAuth
OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时,任何第三方都可以使用OAUTH认证服务,任何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP、JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间,因而OAUTH是简易的。
OAuth协议特点
- 简单:不管是OAUTH服务提供者还是应用开发者,都很易于理解与使用;
- 安全:没有涉及到用户密钥等信息,更安全更灵活;
- 开放:任何服务提供商都可以实现OAUTH,任何软件开发商都可以使用OAUTH;
三、 运行流程
Client:客户端
Resource Ower:资源拥有者
Authorization Service: 验证服务器
Resource Service: 资源服务器
(A) 请求授权 用户打开客户端以后,客户端要求用户给予授权。
(B) 授权许可 用户同意给予客户端授权。
(C) 授权许可 客户端使用上一步获得的授权,向认证服务器申请令牌。
(D) 访问令牌 认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
(E) 访问令牌 客户端使用令牌,向资源服务器申请获取资源。
(F) 受保护的资源 资源服务器确认令牌无误,同意向客户端开放资源。
四、 授权模式
有四种授权模式
1. 授权码模式(Authorization Code)
2. 密码模式(Resource Owner PasswordCredentials)
3. 简化模式(implicit)
4. 客户端模式(client credentials)
下期详细聊聊四种模式。
参考资料:
Oauth2.0协议rfc6749 https://datatracker.ietf.org/doc/html/rfc6749
阮一峰的网络日志 https://www.ruanyifeng.com/blog/2019/04/oauth_design.html