从LMS 系列API 开始,ClassIn API 接口将使用header进行鉴权,不再使用SafeKey参数进行鉴权。
- 加密后的签名值将放在请求的header里,参数为 “X-EEO-SIGN”,加密规则为
sign = md5(’请求串&key=密钥’)
- 原学校sid和timeStamp将放到header里,对应“X-EEO-UID” 和 “X-EEO-TS” 参数,body参数中不应包含sid和timeStamp。
- “X-EEO-TS” 需保证当前调用接口5分钟以内的 Unix Epoch 时间戳,秒级别!
- body参数中禁止使用 “key” 作为参数名!!!
header示例
{
"X-EEO-SIGN": "5be8ad0ab3740080b8ef240d4e7d6ce4", # 参数加密后sign
"X-EEO-UID": "1540438", # 学校SID
"X-EEO-TS": "1726125243", # 当前调用接口5分钟以内的 Unix Epoch 时间戳,秒级别
"Content-Type": "application/json"
}
如何生成请求签名
Step 1:读取请求body里的参数
● body为json格式,按以下规则,从body中取出参与签名的key/value。
- 数组和字典类参数不参与签名,需剔除;
- 请求体字节长度大于1024的参数,不参与签名,需剔除;
Step 2:即将签名的参数添加必要信息,排序后拼接字符串
- 将sid=XXXXXX以及timeStamp=XXXXXXXX添加进待签名的参数中;
- 按参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串。
Step 3:字符串拼接秘钥
在上述字符串后面再拼接 '&key=秘钥'
Step 4:计算整个字符串的32位小写md5值
计算整个字符串的md5值(32位小写)作为签名值,即sign;
Step 5:根据前面信息生成用于请求API的header
{
"X-EEO-SIGN": "sign",
"X-EEO-UID": "sid",
"X-EEO-TS": "timeStamp",
"Content-Type": "application/json"
}
示例
假设一个接口请求如下,密钥:Mb7SR6H
curl --location --request POST '/lms/unit/test' \
--header 'X-EEO-SIGN: 4f97f55addf4921a05c2395617cd8a7b' \
--header 'X-EEO-UID: 1000082' \
--header 'X-EEO-TS: 1721095405' \
--header 'Content-Type: application/json' \
--data-raw '{
"courseId": 132323,
"unitJson": [
{
"name": "string",
"content": "string",
"publishFlag": 0
}
],
}'
拼接请求串
排除不参与签名的请求参数:unitJson(数组),再加上sid和timeStamp,得到请求参数和值列表如下:
| 参数名 | 参数值 | | --- | --- | | sid | 1000082 | | courseId | 132323 | | timeStamp | 1721095405 |
将得到的参数按参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
在stringA最后拼接上key(密钥),得到待签名字符串。
按以上规则,示例中得到的待签名字符串如下:
courseId=132323&sid=1000082&timeStamp=1673949471&key=Mb7SR6H
计算签名
对待签名字符串进行 md5 运算,得到签名值。
此示例计算结果是
4f97f55addf4921a05c2395617cd8a7b
。
代码实例
签名失败
签名失败相关错误码如下
错误码 | 说明 |
---|---|
101002005 | 签名异常(签名没有传或者错误) |
101002006 | 验签时间戳过期(当前时间前后5分钟内) |
101002008 | 时间戳不存在 |
121601030 | 参数不全或者错误 |