OAuth 1.0的OAuth Request Body Hash extension指定发送非格式编码的请求主体的使用者应将请求主体的SHA1哈希包括在签名基本字符串中,作为oauth_body_hash参数。 Signpost没有对此扩展的内置支持,但是我要连接的服务需要它。如何将参数添加到请求中?
最佳答案
路标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")+"\"");