需求说明
客户平台需要访问注册到omc的网关设备web。
网关设备注册到omc后,建立了一个tcp连接。omc通过这个连接直接调用网关设备的api来进行数据交互,因此访问omc的ip地址就相当于可以直接访问到网关设备。
...
但是客户平台和omc部署在不同服务器上,客户平台web跳转到omc存在跨域的问题,所以跳转时需要填omc的账号密码。理论上密码不应该进行传输,但是如果不传输,omc前端和后端交互时不知道客户平台的账号密码,当前omc的前端架构如果不知道账号密码,是不能进行跳转的,因此需要设计一套鉴权方案。
解决方案
使用数字签名验证客户身份。
原理
数字签名
定义:数字签名是一种通过加密技术确保信息的完整性和来源的机制。它允许接收方验证发送方的身份,并确认消息在传输过程中未被篡改。
工作原理:
- 客户端使用其私钥(API 密钥的秘密部分)对请求数据(例如,时间戳和请求体)生成 HMAC 签名。
- 这个签名与请求一起发送到服务端。
- 服务端使用存储的私钥(API 密钥的秘密部分)和相同的请求数据重新生成签名。
- 服务端比较生成的签名与客户端发送的签名。如果两者匹配,则请求有效。
实施细节
服务端生成密钥对,将客户端的公钥apiKey和私钥secretKey存放到mongoDB,并将密钥对给客户平台。omc不能明文储存私钥,需进行对称加密。
客户平台
- 访问omc鉴权接口,获取omc返回的token
请求头携带API信息ACCESS-KEY ACCESS-SIGN ACCESS-TIMESTAMP
...
代码块 |
---|
http://192.168.1.28/platformIndex.html?mac=00:53:4c:40:1a:50&token=U2FsdGVkX19ZgrRfjg6xXP9SNpctIWJPulBFjPFPltI=%3D |
omc前端
- 响应客户平台登录请求
收到客户平台跳转请求时,访问后端接口验证token有效性,若token有效服务端返回客户账户密码。
代码块 |
---|
http://192.168.1.28/jscmd/login |
omc后端
- 响应客户平台鉴权请求,返回token
- 响应'/api/login' ,根据公钥ACCESS-KEY,从数据库查询私钥,计算ACCESS-SIGN,若与请求一致,返回token。
- 响应omc前端登录请求,登录成功
...