OAuth2授权协议使用
1. OAuth2是什么?
OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0。
举个简单的例子: 你住在一个大型的居民小区,小区有门禁系统,进入的时候需要输入密码。你经常网购和外卖,每天都有快递员来送货。你必须找到一个办法,让快递员通过门禁系统,进入小区。如果你把自己的密码,告诉快递员,他就拥有了与我同样的权限,这样好像不太合适。那有没有一种办法,让快递员能够自由进入小区,又不必知道小区居民的密码。有,那就是快递员先向你获取授权,经过你同意之后,生成一个令牌(token),令牌只能在短期(比如7天)内有效。
应用场景: 第三方应用授权登录
2. 四种授权模式
授权码模式(authorization code)
简化模式(implicit)
密码模式(resource owner password credentials)
客户端模式(client credentials)
授权码模式是最常用的流程,安全性也最高,它适用于那些有后端的 Web 应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。
3. 如何利用面向对象设计和编程开发接口鉴权功能
3.1 需求分析
调用方将请求接口的url, AppID, 密码,时间戳拼接在一起然后进行加密,生成一个token, 调用方在进行接口请求的时候,将这个token及AppID,时间戳随RUL一起传递给服务端,服务方接到这些数据后根据AppID从数据库中取出密码,先判断token是否过期,如果没有过期,服务端再通过url, AppID,密码,时间戳拼接加密生成token,然后比较token是否相同。
3.2 进行面向对象设计的步骤
l 划分职责进而识别出有哪些类;
l 定义类及其属性和方法;
l 定义类与类之间的交互关系
l 将类组装起来并提供执行入口
3.2.1 划分职责进而识别出有哪些类
将需求拆解成功能点列表,以上需求拆解功能点如下:
- 把 URL、AppID、密码、时间戳拼接为一个字符串;
- 对字符串通过加密算法加密生成 token;
- 将 token、AppID、时间戳拼接到 URL 中,形成新的 URL;
- 解析 URL,得到 token、AppID、时间戳等信息;
- 从存储中取出 AppID 和对应的密码;
- 根据时间戳判断 token 是否过期失效;
- 验证两个 token 是否匹配;
1, 2, 6, 7都是和token有关,负责token的生成验证; 3,4 都是在处理URL,负责URL的拼接,解析 ; 5是操作AppID和密码,负责从存储中读取AppID和密码。所以可以粗略地得到核心的三个类,AuthToken, Url, CredentialStorage。
3.3 定义类及其属性和方法;
分析之后可以得出各个类的属性和方法:
AuthToken类:
Url类:
虽然需求描述中,我们都是以URL来代替接口请求,但是,接口请求并不一定是以URL的形式来表达,还有可能是Dubbo, RPC等其他形式。为了让这个类更加通用,命名更加贴切,我们接下来把它命名为ApiRequest。
CredentialStorage类:
CredentialStorage 类非常简单,类图如下所示。为了做到抽象封装具体的存储方式,我们将 CredentialStorage 设计成了接口,基于接口而非具体的实现编程。
3.4 定义类与类之间的交互关系
UML 统一建模语言中定义了六种类之间的关系。它们分别是:泛化、实现、关联、聚合、组合、依赖。
3.5 将类组装起来并提供执行入口
我们封装所有的实现细节,设计了一个最顶层的 ApiAuthenticator 接口类,暴露一组给外部调用者使用的 API 接口,作为触发执行鉴权逻辑的入口。
4. 参考文章
https://www.jianshu.com/p/4f5fcddb4106
http://www.ruanyifeng.com/blog/2019/04/oauth_design.html
https://time.geekbang.org/column/article/171767