登录认证

登录认证

我们约定所有的接口都需要认证,所有的接口请求头Header都需要带以下字段

字段名类型说明
accessIdString用户的appId
timestampString时间戳(秒)
signatureString签名字段(签名结果)

appId获取

用户需前往 用户前端页面开启SDK功能 生成秘钥appId

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 其他为失败

字段名类型说明
codeint返回200 为成功(注意不是http返回码)
dataObject返回的数据对象
{
    "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请求头参数不全
902appId不正确
业务咨询:400-8037-298