Ruby生成API认证HMAC签名与官方预期值不符问题排查
你代码存在两个核心错误:
- HMAC密钥使用错误
生成签名时你传入的密钥是API_KEY,但按照接口规范,HMAC计算需要用SECRET_KEY作为密钥。 - 哈希值处理逻辑错误
你先调用了OpenSSL::HMAC.hexdigest得到十六进制格式的哈希字符串,再对这个字符串做Base64编码,这不符合规范。正确逻辑应该是直接获取原始二进制格式的哈希结果,再对二进制结果做Base64编码。你之前得到的长字符串本质是对十六进制哈希结果做Base64编码的产物,和规范要求的对原始二进制哈希编码的结果完全不同。
修正后的代码如下:
ts = '1529342939277' nonce = '883b170c-a768-41a1-ae6d-c626323aa128' host = 'ws.idms.lexisnexis.com' resource_path = '/restws/identity/v3/accounts/11111/workflows/rdp.test.workflow/conversations' body_hash = 'fQoIAs0IO4vNleZVE9tcI3Ni7h+niT+GrrgEHsKZOyM=' API_KEY = '6njQLkz7uCiz1ZeJ1bFCWX4DFVTfKQXa' SECRET_KEY = 'CcdaZEt7co647iJoEc5G29CHtlo7T9M3' # 拼接签名串 signature = [ts, nonce, host, resource_path, body_hash].join("\n") # 修正逻辑:用SECRET_KEY作为密钥,直接获取二进制哈希结果再做Base64编码 mac = Base64.strict_encode64(OpenSSL::HMAC.digest('SHA256', SECRET_KEY, signature))
运行上述代码得到的mac值就是预期的Syb6i+sRygAGCgxLQJ4NwwKcT5Mnkh4r3QXgwZ3vmcE=。
内容的提问来源于stack exchange,提问作者mr_muscle
相关产品推荐
相关产品推荐

