【发布时间】:2019-11-14 18:42:00
【问题描述】:
我想编写一个 java 方法,该方法将接收包含 Authorization 标头的请求,并使用 HMAC-SHA1 生成 Oauth 签名并将其作为响应发送。我想知道如何实现这个?
我希望该方法应该从请求中获取签名基字符串并使用算法生成签名。如果我错了或者有任何其他方法可以获得类似的输出,请纠正我。
【问题讨论】:
我想编写一个 java 方法,该方法将接收包含 Authorization 标头的请求,并使用 HMAC-SHA1 生成 Oauth 签名并将其作为响应发送。我想知道如何实现这个?
我希望该方法应该从请求中获取签名基字符串并使用算法生成签名。如果我错了或者有任何其他方法可以获得类似的输出,请纠正我。
【问题讨论】:
这个问题在某些方面是不正确的,因为“授权标头”里面会有签名。如果您想验证 oauth 请求,那么您将首先验证消费者密钥,然后使用所有其他字段和将存储在您端的秘密生成签名,并根据“授权标头”中的签名对其进行验证。
但是,如果您想签署请求,那么有很多开源库可以做到这一点。我正在使用 Jersey 的“oauth 签名”库来签署请求。
public static String getOAuthHeader(final String url, final String method,
final String realm, final String consumerSecret,
final String consumerKey, final String callback,
final String verifier, final String token,
final String tokenSecret, final String host) {
String oauthHeader = null;
OAuthSecrets secrets = new OAuthSecrets()
.consumerSecret(consumerSecret);
OAuthParameters authParams = new OAuthParameters()
.consumerKey(consumerKey).signatureMethod(HMAC_SHA1.NAME)
.version(AuthenticationConstants.OAUTH_VERSION_10A)
.realm(realm).nonce().timestamp();
if (callback != null) {
authParams = authParams.callback(callback);
}
if (verifier != null) {
authParams = authParams.verifier(verifier);
}
if (token != null) {
authParams = authParams.token(token);
}
if (tokenSecret != null) {
secrets = secrets.tokenSecret(tokenSecret);
}
final OAuthRequestData request = new OAuthRequestData();
request.setRequestMethod(method);
request.setRequestURL(url);
request.addHeaderValue(AuthenticationConstants.HOST_HEADER, host);
try {
OAuthSignature.sign(request, authParams, secrets);
final List<String> header = request
.getHeaderValues(OAuthParameters.AUTHORIZATION_HEADER);
oauthHeader = header.get(0);
} catch (final OAuthSignatureException oae) {
//handle this exception
}
return oauthHeader;
}
【讨论】: