设计模式简记-面向对象实战二运用面向对象分析设计方法开发接口鉴权功能

2.10运用面向对象分析设计方法开发接口鉴权功能

2.10.1需求分析

  • 需求提出:

    “为了保证接口调用的安全性,我们希望设计实现一个接口调用鉴权功能,只有经过认证之后的系统才能调用我们的接口,没有认证过的系统调用我们的接口会被拒绝。我希望由你来负责这个任务的开发,争取尽快上线。”

  • 第一轮基础分析:通过用户名加密码来做认证

    给每个允许访问我们服务的调用方,派发一个应用名(或者叫应用 ID、AppID)和一个对应的密码(或者叫秘钥)。调用方每次进行接口请求的时候,都携带自己的 AppID 和密码。微服务在接收到接口调用请求之后,会解析出 AppID 和密码,跟存储在微服务端的 AppID 和密码进行比对。如果一致,说明认证成功,则允许接口调用请求;否则,就拒绝接口调用请求。

  • 第二轮分析优化:明文传输密码,是不安全的。借助加密算法(比如 SHA),对密码进行加密之后,再传递到微服务端验证,也是不安全的,因为加密之后的密码及 AppID,照样可以被未认证系统(或者说黑客)截获,未认证系统可以携带这个加密之后的密码以及对应的 AppID,伪装成已认证系统来访问我们的接口。这就是典型的**“重放攻击”**。

    token验证:调用方将请求接口的 URL 跟 AppID、密码拼接在一起,然后进行加密,生成一个 token。将appid和token一起传给服务端,服务端根据appid从数据库中取出密码,用相同的方法加密生成token跟客户端传入的token做对比验证,一致通过,不一致拒绝。

    graph TB subgraph Client端 A(1.生成token:SHA--http//ip:port/user?id=123&appid=abc&pwd=pwd123) B(2.生成新url:http//ip:port/user?id=123&appid=abc&token=xxx) A --> B end subgraph Server端 C(3.解析出URL\AppID\token) D(4.从数据库中取出AppID对应的密码) E(5.生成server端token_s) F1(6.允许访问) F2(6.拒绝访问) B --访问Server端--> C C --> D D --> E E --token等于token_s--> F1 E --token不等于token_s--> F2 end

猜你喜欢

转载自www.cnblogs.com/wod-Y/p/12340710.html