淘宝网针对h5的浏览选用了和手机客户端不一样的方法,因为在h5的js代码中储存appsercret具备较高的风险性,mtop选用了任意分派动态口令的方法,为每一个浏览端分派一个token,储存在客户的cookie中,根据cookie带到服务器端分派的token, 手机客户端运用分派的token对要求的URL主要参数形成引言值sign,MTOP运用这一摘用值和cookie中的token来避免 URL伪造。
步骤
当当地cookie中的token为空时(一般是第一次浏览),mtop会接到”FAIL_SYS_TOKEN_EXOIRED:: 动态口令到期“这一不正确回复,另外mtop会形成token载入cookie中(response.cookies);
第二次要求时,js根据载入cookie中的token值,依照承诺的优化算法形成sign, sign在mtop的要求中携带,mtop根据cookie中合token用一样的方法测算出sign,与要求的sign开展较为,查验根据将回到api的回复,不成功提醒“FAIL_SYS_ILLEGAL_ACCESS:: 非法请求”;
cookie中的token是有及时性的,碰到token无效时,将接到回复"FAIL_SYS_TOKEN_EXOIRED:: 动态口令到期", 另外会载入新的token,js运用新的token再次测算sign并举发要求;
有关cookie中的token的个人检查,因为token在cookie中是密文的,很有可能会被假冒,在輸出的cookie中包括一个用非对称加密密匙的公匙数据加密后的token, MTOP在每一次要求的时候会先查验cookie中的token是不是由服务器端分派出来的(运用数据加密后的token和公钥复原token,与传回的密文token较为)
sign 形成
有关sign的形成公式计算:
md5Hex(token&t&appKey&data)
如:md5Hex("30dc68e5b4cf40ebd02fb05673c7e3b7&1572522062317&12345678&{"itemNumId":"1502111132496"}")
sign=4c1e7b6853fa7a5e1b8f7066ee22932f
完成编码:
public static String calcSignature(String token, String timestamp, String appKey, String data) {
return DigestUtils.md5Hex(StringUtils.trimToEmpty(token) "&"
timestamp "&" appKey "&" data);
}
public static void main(String[] args) {
String token="30dc68e5b4cf40ebd02fb05673c7e3b7";
String timestamp="1572522062317";
String sign = calcSignature(token, timestamp, "12345678", "{\"itemNumId\":\"1502111132496\"}");
System.out.println(sign);
}
token
m_h5tk: 文件格式为 密文token_expireTime, 从response.cookies处获得,如: 30dc68e5b4cf40ebd02fb05673c7e3b7_1572522062317
token便是 30dc68e5b4cf40ebd02fb05673c7e3b7
无效时间 1572522062317
可封裝在一个类中承担储存token