开发提供简单签名验证的接口
由 0x400 发布于
## 示例代码
### 服务管理-接口中创建 `getTaskCount` 接口
```javascript
// 系统应用密钥和应用ID
var sysAppSecret = "e46ecccfe6e64fe5afe4d52935bbae57";
var sysAppId = "1000010";
// 返回数据模板
var returnData = {"type": "success"};
function setMessage(type, message) {
returnData.type = type;
returnData.message = message;
this.response.setBody(returnData, "application/json");
}
// 解析请求体
var requestJson = JSON.parse(requestText);
if (requestText === "null" || typeof requestJson !== "object") {
setMessage("error", "传入的格式化不正确");
return;
}
// 获取用户ID
function getUserId(person) {
var userId = "";
var orgAction = this.Actions.load("x_organization_assemble_express");
orgAction.PersonAction.get(person, function (json) {
data = json.data;
userId = json.data.unique;
}.bind(this));
return userId;
}
// 将字符串转换为UTF-8字节数组
function getBytesUTF8(str) {
var Charset = Java.type("java.nio.charset.Charset");
var StandardCharsets = Java.type("java.nio.charset.StandardCharsets");
var ByteBuffer = Java.type("java.nio.ByteBuffer");
var charset = StandardCharsets.UTF_8;
if (typeof str !== "string") {
str = String(str);
}
var byteBuffer = charset.encode(str);
var bytes = [];
while (byteBuffer.hasRemaining()) {
bytes.push(byteBuffer.get());
}
return bytes;
}
// 获取请求头信息
var timestamp = request.getHeader("timeStamp");
var signature = request.getHeader("signature");
var appid = request.getHeader("appid");
// 验证应用ID
if (appid !== sysAppId) {
setMessage("error", "应用不存在");
return;
}
// 验证时间戳的有效性
var nowTimestamp = new Date().getTime();
var difference = Math.abs(timestamp - nowTimestamp);
if (difference > 50 * 60 * 1000) {
setMessage("error", "时间相差5分钟");
return;
}
// 计算新的签名
var DigestUtils = Java.type("org.apache.commons.codec.digest.DigestUtils");
var signatureNew = DigestUtils.sha256Hex(getBytesUTF8(sysAppSecret + ":" + timestamp));
print("signatureNew: " + signatureNew);
// 验证签名
if (signature !== signatureNew) {
setMessage("error", "签名错误");
return;
}
// 获取指定用户的待办数量
this.getTaskCount = function() {
var userId = getUserId(data.mobile);
if (userId === "") {
setMessage("error", "用户不存在");
return;
}
var applicationList = [];
var action = this.Actions.load("x_processplatform_assemble_surface");
action.TaskAction.manageListFilterPaging(1, 1, {
"credentialList": [data.mobile],
"applicationList": applicationList
}, function (json) {
returnData.data = {
"total": json.count
};
}.bind(this));
}
// 调用方法
var fun = requestJson.fun;
var data = requestJson.data;
this[fun]();
this.response.setBody(returnData, "application/json");
```
## 调用方法
### 请求头信息
| 参数名 | 类型 | 描述 |
|-------------|--------|--------------|
| timeStamp | Long | 时间戳 |
| signature | String | 签名 |
| appid | String | 应用ID |
### 请求体示例
```json
{
"fun": "getTaskCount",
"data": {
"mobile": "13800000000"
}
}
```
### 签名计算
签名的计算方式如下:
1. 拼接 `sysAppSecret` 和 `timestamp`,格式为 `sysAppSecret:timestamp`。
2. 使用 SHA-256 算法对拼接后的字符串进行哈希计算,并将其转换为十六进制字符串。
例如:
```javascript
var signatureNew = DigestUtils.sha256Hex(getBytesUTF8("e46ecccfe6e64fe5afe4d52935bbae57:1679030400000"));
```
### 响应示例
成功响应:
```json
{
"type": "success",
"data": {
"total": 10
}
}
```
错误响应:
```json
{
"type": "error",
"message": "签名错误"
}
```
评论