签名认证
更新时间:2019-06-14
地域风向标API会对每个访问的请求进行身份认证,以保障用户的安全。安全认证采用Access Key与请求签名机制。Access Key由Access Key ID和Secret Access Key组成,均为字符串,由百度开放云官方颁发给用户。其中Access Key ID用于标识用户身份,Access Key Secret 是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密。
对于每个HTTP请求,用户需要使用下文所描述的方式生成一个签名字符串,并将认证字符串放在HTTP请求的Authorization头域里。
签名字符串格式
bce-auth-v{version}/{accessKeyId}/{timestamp}/{expireTime}/{signedHeaders}/{signature}
其中:
- version是正整数,目前取值为1。
- timestamp是生成签名时的时间。时间格式符合通用约定。
- expireTime表示签名有效期限,单位为秒,从timestamp所指定的时间开始计算。
- signedHeaders是签名算法中涉及到的头域列表。头域名字之间用分号(;)分隔,如host;x-bce-date。列表按照字典序排列。当signedHeaders为空时表示取默认值。
- signature是256位签名的十六进制表示,由64个小写字母组成,生成方式由如下签名生成算法给出。
签名生成算法
有关签名生成算法的具体介绍,请参看鉴权认证机制。
token生成算法
token为使用 HMAC 方法生成带有密钥的哈希值,通过user_key和user_secret生成。申请开通舆情服务后,user_key和user_secret由百度智能云提供。生成token的参考代码如下:
python
import time
import hmac
import hashlib
timestamp = str(int(time.time()))
token = hmac.new(api_secret, api_key + timestamp, hashlib.sha1).hexdigest()
java
public static void main(String[] args) {
String user_key = "d520c05ea2ab40568f119154ac7de67f"; //实际使用时客户需修改为自己的user_key
String user_secret = "825a1efa5b29c29272ae8a6c5286fdrf"; //实际使用时客户需修改为自己的user_secret
long timestamp = System.currentTimeMillis();
String data = user_key + timestamp;
String hmac = encode(data, user_secret);
System.out.println(hmac);
}
private static String toHexString(byte[] bytes) {
Formatter formatter = new Formatter();
for (byte b : bytes) {
formatter.format("%02x", b);
}
return formatter.toString();
}
private static String encode(String data, String key) {
String token = null;
try {
SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(signingKey);
token = toHexString(mac.doFinal(data.getBytes()));
} catch (Exception e) {
e.printStackTrace();
}
return token;
}