登录认证
登录认证
我们约定所有的接口都需要认证,所有的接口请求头Header都需要带以下字段
字段名 | 类型 | 说明 |
---|---|---|
accessId | String | 用户的appId |
timestamp | String | 时间戳(秒) |
signature | String | 签名字段(签名结果) |
appId获取
用户需前往 用户前端页面开启SDK功能 生成秘钥与appId
时间戳生成
下面以java代码为例
String time=(System.currentTimeMillis()/1000L)+"";
签名
1 拼接签名字符串
1.1 GET 请求
用户需把Get请求参数按传输顺序拼接,参数为空或为null不参与拼接.比如 http://192.168.0.1/info?a=3&b=3 转换结果为
a=3&b=3
注意:如果是参数是带在路径上面的可以不用转换 例如 http://192.168.0.1/info/3
1.2 其他请求
用户需把其他请求里面的body转换为JSON (这里特指请求头为content-type="application/json")
1.3 拼接字段
下面使用java代码说明
StringBuffer s2s = new StringBuffer();
s2s.append("[");
s2s.append(reqMethod.toUpperCase()); //请求方法 get post put delete 这些
s2s.append("]");
s2s.append(path); //请求路径 例如 192.168.0.1/info?a=3 路径为 /info 192.168.0.1/info/b 路径为/info/b
s2s.append("&");
s2s.append(appId); //用户前端页面生成的appId
s2s.append("&");
s2s.append(timestamp); //时间戳
if(!StrUtil.isEmpty(jsonText)){ //如果请求内容为空不需要参与签名
s2s.append("&").append(jsonText);
}
return s2s.toString();
2 生成签名
2.1 Java
本sdk加密方式采用的是SHA256withRSA 下面是java代码签名示例
RSA rsa=new RSA(privateKey,null);
Signature sign = Signature.getInstance("SHA256withRSA");
sign.initSign(rsa.getPrivateKey());
sign.update(sigStr.getBytes(Charset.forName("UTF-8"))); //sinStr为你的签名字符串
byte[] bytes=sign.sign();
String signResult= Base64.getEncoder().encodeToString(bytes); //signResult 为签名结果
2.2 JavaScript
// new一个RSA对象
let rsa = new jsrsasign.RSAKey()
// SHA256withRSA私钥
const k = `-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANnTr4H9traEQlZQo/Uy92E6ikWVt6x3vRMVLqAsSUGEz4tdh8fs4YMlrk+TRDYjTxPA6w5LMd+/AB1FEXjQs2M1cJx5tW
oZSMusZgQnfM9P0FcsmgQ2tJLkSM435my1VnNdxn6KDvoaummhu5zin0BCfZC/QghwHg6vcz32GWuHAgMBAAECgYAbfkhK3XWYKtsJSaCwJvsp+/ljgrFN+kep5sSy9clXP4acngpbIG8Z
nldrzCLSEc8o0fLjzneLOJswlpJNJUuxexeeoIY9hOdwh1gDXch0ihbY7h1zey70wbLUnLhgkAkAvmghlvZTlziKFdaRPYfpN6VU52BeDRPzy/uBBLh7TQJBAPZ75xJ9j8MQedcKr/0xVk
hThA51gUwr9aQOz0g/Alf/DaOTQR3NcPob3lrYF+uDdnX2Yh2Ilj785eTITCOwdb0CQQDiPI2+V47j9GKFdP50a/gLliu6tYcHMu97LOZ0Uy5ABAjNavZvRqvkLZ/fJ8IYe1F8Ox1XMooA
1Ew20WSPshCTAkEAvLQzPia+73onrYjTH6asBgdabK9tY+Gr2AQ2kXsb0j7ENF1CVwy31+OKIkaaWYZ2JO2SREYTsPlxD+yAzjoEiQJAfIIe8DZ36XTCE/jDYYdaR+YpwuPMoGWj7wJTAo
oU1h5iScsoPS2DxFxntATJiXe07M4L48VotfQgzbqHwZ2aCQJAJdkLHqsWV51AHTabg+Hod/ZLZJP+avsq1BakGNU/ByAqvGdL2QKuwfhOLKgEvhmJwi49i9Skb3bp+JhDvxRU1w==
-----END PRIVATE KEY-----`
// 将私钥 转成16进制
rsa = jsrsasign.KEYUTIL.getKey(k)
// 采用SHA256withRSA进行加密
const sig = new jsrsasign.KJUR.crypto.Signature({alg: 'SHA256withRSA'})
// 算法初始化
sig.init(rsa)
const newStr = '[GET]/api/3dcat/user/info&33344333&1625818669&a=34&b=34'
// 对 [GET]/api/3dcat/user/info&33344333&1625818669&a=34&b=34 进行加密
sig.updateString(newStr)
// 将加密后的16进制转成base64,这便是签名
const sign = jsrsasign.hextob64(sig.sign())
// 控制台可打印签名
console.log(sign)
3 签名例子
现有以下拼接字段 签名私钥:
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANnTr4H9traEQlZQo/Uy92E6ikWVt6x3vRMVLqAsSUGEz4tdh8fs4YMlrk+TRDYjTxPA6w5LMd+/AB1FEXjQs2M1cJx5tWoZSMusZgQnfM9P0FcsmgQ2tJLkSM435my1VnNdxn6KDvoaummhu5zin0BCfZC/QghwHg6vcz32GWuHAgMBAAECgYAbfkhK3XWYKtsJSaCwJvsp+/ljgrFN+kep5sSy9clXP4acngpbIG8ZnldrzCLSEc8o0fLjzneLOJswlpJNJUuxexeeoIY9hOdwh1gDXch0ihbY7h1zey70wbLUnLhgkAkAvmghlvZTlziKFdaRPYfpN6VU52BeDRPzy/uBBLh7TQJBAPZ75xJ9j8MQedcKr/0xVkhThA51gUwr9aQOz0g/Alf/DaOTQR3NcPob3lrYF+uDdnX2Yh2Ilj785eTITCOwdb0CQQDiPI2+V47j9GKFdP50a/gLliu6tYcHMu97LOZ0Uy5ABAjNavZvRqvkLZ/fJ8IYe1F8Ox1XMooA1Ew20WSPshCTAkEAvLQzPia+73onrYjTH6asBgdabK9tY+Gr2AQ2kXsb0j7ENF1CVwy31+OKIkaaWYZ2JO2SREYTsPlxD+yAzjoEiQJAfIIe8DZ36XTCE/jDYYdaR+YpwuPMoGWj7wJTAooU1h5iScsoPS2DxFxntATJiXe07M4L48VotfQgzbqHwZ2aCQJAJdkLHqsWV51AHTabg+Hod/ZLZJP+avsq1BakGNU/ByAqvGdL2QKuwfhOLKgEvhmJwi49i9Skb3bp+JhDvxRU1w==
签名内容:
[GET]/api/3dcat/user/info&33344333&1625818669&a=34&b=34
签名结果
Orm3jq4+MZzJta0iSdHsLA3v0klYeJZv7MmRJNlyCRVq4An4GshYblm7jF+wzrSBciAvA0Bdq8NojhIFuc1Yfw47ETibJEOvsq9PCvyL6WyBhe1CEwL/8QPZOR8K4ZwSiJaIqDcuXYzt7fl4DSpkBGADcbbPKDp4hNafJIWNS2g=
接口返回格式
这里约定 接口 返回的http 状态码 为200 其他为失败, code 返回 为200 其他为失败
字段名 | 类型 | 说明 |
---|---|---|
code | int | 返回200 为成功(注意不是http返回码) |
data | Object | 返回的数据对象 |
{
"code": 200,
"data": {
"d": "34",
"s": "34"
},
"message": "success",
"requestId": "343434",
"result": true,
"serverTime": 1625824236454,
"version": "1.0.0"
}
常用返回状态码
code值 | 说明 |
---|---|
200 | 成功 |
100 | 失败 |
610 | 签名过期 |
611 | 非法签名 |
612 | 非法鉴权 |
901 | 请求头参数不全 |
902 | appId不正确 |