【发布时间】:2021-11-14 11:07:57
【问题描述】:
我试图从 Twitter 发帖,所以我必须生成 oauth1.0 签名,所以我尝试实现它
public static String prepareParameterString(Authorization authorization) {
StringBuilder builder = new StringBuilder();
builder.append("include_entities=true").
append("&").append("oauth_consumer_key=").append(percentEncode(authorization.getOauthCustomerKey())).
append("&").append("oauth_nonce=").append(percentEncode(authorization.getOauthNonce()))
.append("&").append("oauth_signature_method=").append(percentEncode(authorization.getOauthSignatureMethod()))
.append("&").append("oauth_timestamp=").append(percentEncode(authorization.getOauthTimeStamp()))
.append("&").append("oauth_token=").append(percentEncode(authorization.getOauthTokenKey()))
.append("&").append("oauth_version=").append(percentEncode(authorization.getOauthVersion()))
.append("&").append("status=").append(percentEncode(authorization.getStatus()));
return builder.toString();
}
这就是我创建基本字符串的方法
public static String prepareSignatureBaseString(String paramaterString, String httpMethod, String url) {
return httpMethod + "&" + percentEncode(url) + "&" + percentEncode(paramaterString);
}
public static String calculateSigningKey(Authorization authorization) {
return percentEncode(Objects.requireNonNull(authorization.getOauthConsumerSecret())) + "&" +
percentEncode(Objects.requireNonNull(authorization.getOauthTokenSecret()));
}
public static String calculateHMAC(String input, String signingKey) {
try {
SecretKeySpec secretKeySpec = new SecretKeySpec(signingKey.getBytes(),
HMAC_SHA1_ALGORITHM);
Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
mac.init(secretKeySpec);
return Base64.getEncoder().encodeToString(mac.doFinal(input.getBytes()));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
所以这些是用于创建签名密钥和哈希的方法
public static String generateTimeStamp() {
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
return (timestamp.getTime() / 1000L) + "";
}
public static String generateNonce() {
return UUID.randomUUID().toString().replace("-", "");
}
public static String percentEncode(String string) {
return new PercentEscaper("-_.~").escape(string);
}
这些是用于生成来自番石榴库的 nonce 、 Timestamp 、百分比编码的代码
public static String getAuthorizationHeader(Signature status) {
StringBuilder builder = new StringBuilder();
appendParameter(builder, "oauth_consumer_key", status.getAuthorization().getOauthCustomerKey());
appendParameter(builder, "oauth_nonce", status.getAuthorization().getOauthNonce());
appendParameter(builder, "oauth_signature", status.getSignature());
appendParameter(builder, "oauth_signature_method", status.getAuthorization().getOauthSignatureMethod());
appendParameter(builder, "oauth_timestamp", status.getAuthorization().getOauthTimeStamp());
appendParameter(builder, "oauth_token", status.getAuthorization().getOauthTokenKey());
appendParameter(builder, "oauth_version", status.getAuthorization().getOauthVersion());
System.out.println(builder.toString());
return builder.substring(0, builder.length() - 1);
}
private static void appendParameter(StringBuilder buf, String name, String value) {
if (value != null) {
buf.append(' ').append(percentEncode(name)).append("=\"").append(percentEncode(value)).append("\",");
}
}
即使测试用例使用 twitter 提供的数据成功运行,我也已按照文档完成所有操作
@Test
void urlEncoderTest2() {
assertEquals("Hello%20Ladies%20%2B%20Gentlemen%2C%20a%20signed%20OAuth%20request%21",
SecurityUtils.percentEncode("Hello Ladies + Gentlemen, a signed OAuth request!"));
}
@Test
void securityTest() {
Authorization authorization = new Authorization("xvz1evFS4wEEPTGEFPHBog",
"kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw",
"370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb",
"LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE", "Hello Ladies + Gentlemen, a signed OAuth request!");
Signature signature = new Signature(authorization);
authorization.setOauthNonce("kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg");
authorization.setOauthTimeStamp("1318622958");
assertEquals("hCtSmYh+iHYCEqBWrE7C7hYmtUk=" ,signature.generateSignature());
}
我使用 OAuth 标头发送它但收到 400 错误
{
"errors": [
{
"code": 215,
"message": "Bad Authentication data."
}
],
}
谁能告诉我错过的地方提前谢谢
【问题讨论】:
标签: java twitter oauth twitter-oauth