平台的理念是一个组织内部只建一套系统。但是现实情况是,组织内部已经建立了很多系统,是不能一次性替代的,只能先搭起平台,然后逐步开始替换。这样就不可避免的存在其他系统和平台进行交互的问题。
平台为此设计了开放API接口。其中的核心问题是鉴权。鉴权有多种模式,平台选择了签名鉴权模式,省去了先握手获取Token,然后用Token访问的复杂过程。下面详细说明接口签名鉴权设计原理。
接入系统首先需要从平台获取应用ID(AppID)和应用密钥(AppSecret)
接入系统调用平台API时,需要填充如下头信息:
QLM-Open-App-Id:应用ID QLM-Open-Auth-Mode:固定值Signature QLM-Open-CA-Signature:签名值,这个是鉴权的核心 QLM-Open-CA-Timestamp:时间戳,单位毫秒 Accept:响应类型,固定为*/* Content-Type:application/json; charset=UTF-8 Content-MD5:请求Body体数据的 Content-MD5 值
签名计算是鉴权的核心,它可以确保是由AppID对应的客户端发起的,且发起内容在传输过程中没有被篡改。签名过程如下:
1、准备待签名字符串。
第一行:HTTP的请求方法,需大写。距离:GET、POST。
第二行:固定为*/*
第三行:请求头中的QLM-Open-CA-Timestamp值
第四行:请求头中的 Content-Type 值
第五行:请求头中的QLM-Open-CA-Timestamp
第六行:请求地址,注意不含服务器及其端口
注意行以/n结束,不要加/r,另外大小写是敏感的。
2、计算签名。
使用 AppSecret(应用密钥) 对待签名字符串进行 HmacSHA256 加密处理
服务器端校验原理,从请求头里获取应用ID,查询后台登记信息,找到对应的AppSecret,对信息进行同样的处理,最后验证签名是否一样。
基于同样原理,可以对请求body做校验,确保传输过程中,请求没有被篡改。基本方式是客户端对body进行处理,然后将结果存入Content-MD5头中,服务器端收到请求后,做同样处理,然后验证是否一致。
小技巧:平台提供的接口可能会大改,为了保持兼容,接口地址第一段是版本,目前只提供了/V1/*,将来会提供/V2/*。