如何使用Signpost发送oauth_body_hash?

时间:2015-01-28 23:59:57

标签: java oauth signpost

OAuth 1.0的OAuth Request Body Hash extension指定发送非格式编码请求正文的使用者应将签名基本字符串中的请求正文的SHA1哈希包含为oauth_body_hash参数。路标没有内置支持此扩展,但我连接的服务需要它。如何将参数添加到我的请求中?

1 个答案:

答案 0 :(得分:1)

路标OAuthConsumer类提供了setAdditionalParameters方法。只需计算哈希并自己添加参数。唯一的复杂因素是这些参数不会被Signpost进行百分比转义,因为OAuth Parameter Encoding指定了,所以您需要自己完成。这是一个例子:

MessageDigest md = MessageDigest.getInstance("SHA1");
md.update(requestBody.getBytes());
byte[] output = Base64.encodeBase64(md.digest());
String hash = new String(output);
HttpParameters parameters = new HttpParameters();
parameters.put("oauth_body_hash", URLEncoder.encode(hash, "UTF-8"));

CommonsHttpOAuthConsumer signer = new CommonsHttpOAuthConsumer(key, secret);
HttpPost request = new HttpPost(url);
request.setHeader("Content-Type", "application/xml");
request.setEntity(new StringEntity(requestBody, "UTF-8"));
signer.setAdditionalParameters(parameters);
signer.sign(request);

或者,您可以在签名之前在请求上设置标头,Signpost会将其标头与您自己的标头合并:

request.setHeader("Authorization", "OAuth oauth_body_hash=\""+URLEncoder.encode(hash, "UTF-8")+"\"");