1.确定签名算法是否正确
JAVA客户端
String sSignStr = "fasdfasdfappKey458756388appNametestati1234560123456sessionId234234234taobaoUserId23423432time2021-08-10 14:59:11topAppKey573014userId223430998userIp127.0.0.1fasdfasdf"; Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); SecretKeySpec secret_key = new SecretKeySpec(appSecret.getBytes("utf-8"), "HmacSHA256"); sha256_HMAC.init(secret_key); String signature = Base64.encodeBase64String(sha256_HMAC.doFinal(sSignStr.getBytes("utf-8")));注意:需指定getBytes编码为utf-8,否则可能出现不同环境 不同版本的JDK加密出来的数据不一致
PHP客户端:
$dataStr = 'fasdfasdfappKey458756388appNametestati1234560123456sessionId234234234taobaoUserId23423432time2021-08-10 14:59:11topAppKey573014userId223430998userIp127.0.0.1fasdfasdf'; $appSecret = 'fasdfasdf'; // hash_hmac之后需要返回的二进制,因此最后一个参数需要true $sign = base64_encode(hash_hmac('sha256', $dataStr, $appSecret, true));
以上述Demo为例,加密出来的秘钥值为:sUrE4M7oN1FkBFnj0kHTUA1gJsvT4Ps/iYwJBOZzXzc=。不同客户端语言接入的时候可以以上述Demo数据作为测试数据,来验证自己的加密算法是否正确
2.签名算法验证正常(即使用上诉示例数据加密出来的sign是正确的),但是在使用的时候还是报sign非法
确认参与加密的time字段和实际请求的time字段是否一致。即签名里面的时间值在前后端交互过程中经常会使用不一致。后端会把sign生成好了,并返回相应的参数给前端,包括时间,前端再请求sec-token。请求的时候传递的时间可能不是后端下发的,这个时候会导致sign校验过不去
确认参与加密的字段是否是请求的所有参数,不同接口请求传参不一样, 每次请求都需要获取新的sign(即有接入方反馈说第二步中获取sec-token是正常的,但是获取top-token的时候提示sign非法,第三步生成sign的时候需要把topToken、secToken、method等参数也加进去计算签名)
如使用的是C++ SDK需要升级到版本(1.0.70.703)及以上
出现该错误的原因及sec_token不存在或已失效
sec_token有效期为1天,请确认sec_token是否已失效。(可申请一个新的sec_token)重试后看是否正常
确认sec_token是否被转义/截断。如接入方在使用sec_token时会将sec_token的值存到cookie中,但是因为sec_token中存在特殊字符可能导致取出来的cookie值并非期望的。解决方案是在写入cookie时使用encodeURIComponent进行编码,取值时使用decodeURIComponent进行解码
出现该错误的原因是传递的时间非法
确认参数中是否传递了time字段
time字段的格式是否是yyyy-MM-dd HH:mm:ss
time取值必须是当前时间,且误差在5秒内。如通过打断点时间和阿里云时钟间隔超过5s则会出错
在登陆和解密页面需要加载js sdk
<script src="https://g.alicdn.com/ali-data-safe/securesdk_v3/0.0.2/sec-min.js"></script> <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> <script src="https://g.alicdn.com/code/npm/@ali/cro-securesdk/0.0.5/secToken.js"></script>
确认sec-min.js放到header最前面,提前加载,预计需要300ms-500ms内初始化完成。确保在sec-min.js加载完成后再发起调用
如果上述步骤都确认过header投还是没有出现bx-ua的信息,可能存在的情况: 1.排查公司内部是否有通用组件对header头进行过滤