自己用Java写的一个可以参考一下,我这种5年没写过代码的人都能写,难道比我还新手?你需要多一些信念!
package com.baidu.cloudservice.bfr;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.Date;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Hex;
import com.baidubce.BceClientException;
import com.baidubce.util.DateUtils;
public class BFRSign {
private static final String DEFAULT_ENCODING = "UTF-8";
private static final Charset UTF8 = Charset.forName(DEFAULT_ENCODING);
public static void main(String[] args) throws Exception {
// System.out.println(DateUtils.formatAlternateIso8601Date(new Date()));
String accessKey = "xxxxxxxxxxxxxxxxxxxxxxxx";
String secretKey = "xxxxxxxxxxxxxxxxxxxxxxxx";
String host = "face.bj.baidubce.com";
//String path = "/v1/app";//工程
//String path = "/v1/app/40004/group";//组
//String path = "/v1/app/40004/person"; //人物
//String path ="/v1/app/40004/person/Steve";//验证图片是否属于某个人
String path ="/v1/app/40004/group/yerik"; //验证图片是否属于某个组
String timestamp = DateUtils.formatAlternateIso8601Date(new Date());
int expiresInSeconds = 18000;
String CanonicalURI = URLEncoder.encode(path, "UTF-8").replace("%2F","/");
System.out.println("CanonicalURI: "+CanonicalURI);
// String queryString=new String("verify");
String queryString=new String("identify");
String canonicalQueryString =canonicalQueryString(queryString);
//String requestMethod="GET";
String requestMethod="POST";
//String requestMethod="PUT";
String canonicalHeaders = "host:"+host;
String CanonicalRequest = joinN("\n", new String[] { requestMethod,CanonicalURI, canonicalQueryString, canonicalHeaders });
System.out.println("CanonicalRequest: "+CanonicalRequest);
/*输出结果、请求内容
{"appId":"40004"}
{ "groupName": "yerik"}
{
"personName": "Steve",
"groupName": "yerik",
"faces": [
{
"bosPath":"yerik-bfr/1.jpg"
},
{
"bosPath":"yerik-bfr/2.jpg"
},
{
"bosPath":"yerik-bfr/3.jpg"
},
{
"bosPath":"yerik-bfr/4.jpg"
},
{
"bosPath":"yerik-bfr/5.jpg"
},
{
"bosPath":"yerik-bfr/6.jpg"
},
{
"bosPath":"yerik-bfr/7.jpg"
},
{
"bosPath":"yerik-bfr/8.jpg"
}
]
}
{
"bosPath":"yerik-bfr/test1.jpg"
}
*/
//通过AK+时间戳+过期时间拼接成signKeyInfo
String signKeyInfo = "bce-auth-v1" + "/" + accessKey + "/" + timestamp+ "/" + expiresInSeconds;
System.out.println("signKeyInfo: "+signKeyInfo);
//将signKeyInfo与SK加密生成signingKey
String signingKey = sha256Hex(secretKey, signKeyInfo);
System.out.println("signingKey: "+signingKey);
//将signingKey与CanonicalRequest加密生成signature
String signature = sha256Hex(signingKey, CanonicalRequest);
//通过signature合成authorization
String authorization = joinN("/", new String[] { "bce-auth-v1",accessKey, timestamp, String.valueOf(expiresInSeconds), "host",signature });
System.out.println("authorization: \n"+authorization);
System.out.println("URL: \nhttp://"+host+CanonicalURI+"?"+canonicalQueryString);
}
private static String joinN(String split, String[] args) {
String ret = args[0];
for (int i = 1; i < args.length; i++)
ret = ret + split + args[i];
return ret;
}
public static String sha256Hex(String signingKey, String stringToSign) {
try {
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(signingKey.getBytes(UTF8), "HmacSHA256"));
return new String(Hex.encodeHex(mac.doFinal(stringToSign
.getBytes(UTF8))));
} catch (Exception e) {
throw new BceClientException("Fail to generate the signature", e);
}
}
//canonicalQueryString转换
public static String canonicalQueryString(String queryString) throws Exception{
String canonicalQueryString="";
String[] keyValueList =queryString.split("&");
int position;
String key=null;
String value=null;
if (queryString.isEmpty()){
System.out.println("canonicalQueryString1: "+canonicalQueryString);
return canonicalQueryString;
}else{
for (int i=0;i
position=keyValueList[i].indexOf("=");
if (position<0){
key=URLEncoder.encode(keyValueList[i], "UTF-8");
value="";
}else{
key=URLEncoder.encode(keyValueList[i].substring(0,position), "UTF-8");
value=URLEncoder.encode(keyValueList[i].substring(position+1,keyValueList[i].length()), "UTF-8");
}
//System.out.println("Key"+i+": "+key+"----"+"Value"+i+": "+value);
keyValueList[i]=key+"="+value;
if(i==keyValueList.length-1){
canonicalQueryString=canonicalQueryString+keyValueList[i];
}else{
canonicalQueryString=canonicalQueryString+keyValueList[i]+"&";
}
}
System.out.println("canonicalQueryString2: "+canonicalQueryString);
}
return canonicalQueryString;
}
}