当前位置: 首页 > 知识库问答 >
问题:

Java twitter OAuth,无法验证OAuth签名

朱海超
2023-03-14

我写一个oauth与twitter的代码,我有401错误代码和"失败验证oauth签名和令牌"响应从twitter当我获取后请求到https://api.twitter.com/oauth/request_token.这是我的数据,我有:

Consumer/api key    - ffo9MLdRF8XOd9DKB0HeA
Consumer/api secret - fUJtvIpujTslQOlVbZY6QU8cNEMdwoxzTG1gh93SUgs
Url callback        - https://oauth.vk.com/blank.html

我的步骤:

1.为签名准备的字符串

POST&https%3A%2F%2Fapi.twitter.com%2Foauth%2Frequest_token&oauth_callback%3Dhttps%3A%2F%2Foauth.vk.com%2Fblank.html%26oauth_consumer_key%3Dffo9MLdRF8XOd9DKB0HeA%26oauth_nonce%3Dfb0e9383f0c84326a124dd4ccfddd2d2%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1393951866%26oauth_version%3D1.0

2.通过代码创建签名qQwIvFao9yeIQpi9ouz0oFi7/v8=:

public String calculateSign(String stringToEncode, String secret) throws Exception{
    byte[] keyBytes = secret.getBytes();
    byte[] text = stringToEncode.getBytes();

    SecretKey secretKey = new SecretKeySpec(keyBytes, "HmacSHA1");
    Mac mac = Mac.getInstance("HmacSHA1");
    mac.init(secretKey);

    byte[] encoded = mac.doFinal(text);
    return new String(Base64.encode(encoded, Base64.DEFAULT)).trim();
}

3.最终授权标头(带转义引号):

OAuth oauth_nonce="fb0e9383f0c84326a124dd4ccfddd2d2", oauth_callback="https%3A%2F%2Foauth.vk.com%2Fblank.html", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1393951866", oauth_consumer_key="ffo9MLdRF8XOd9DKB0HeA", oauth_signature="qQwIvFao9yeIQpi9ouz0oFi7%2Fv8%3D", oauth_version="1.0"

问那些可能知道如何使用twitter的人。我的数据有什么问题?我可以提供更多的代码,但我认为它没有用。

我提供了工作证明,我会在3-4小时后更改。

UPD:这是我在计算符号函数中使用的密钥

fUJtvIpujTslQOlVbZY6QU8cNEMdwoxzTG1gh93SUgs%26

共有1个答案

怀展
2023-03-14

签名基字符串中有错误。回调url应为双重编码,因此应为:

... &oauth_callback%3Dhttps%253A%252F%252Foauth.vk.com%252Fblank.html ...

此外,您不需要对符号进行百分比编码

fUJtvIpujTslQOlVbZY6QU8cNEMdwoxzTG1gh93SUgs&

您可以使用在线OAuth测试控制台检查签名。

 类似资料:
  • 我试图从twitter api获取oauth\u令牌,但出现异常: 错误流获取: 验证oauth签名和令牌失败 以下是SignatureBasString、签名和授权标头示例: SignatureBasString:POST 下面是一个代码: 名称值对比较器: URL编码 请求方法 这里是一个twitter应用程序设置: 消费者密钥(API密钥):2YhNLyum1VY10UrWBMqBnatiT

  • 问题内容: 我正在使用node.js request.js到达api。我收到这个错误 [错误:UNABLE_TO_VERIFY_LEAF_SIGNATURE] 我所有的凭据都是准确有效的,并且服务器还不错。我对邮递员提出了同样的要求。 此代码仅在可执行脚本ex中运行。,那是为什么?是否需要在服务器上运行? 问题答案: 注意 :以下情况很危险,并且将允许在客户端和服务器之间截取和修改API内容。 这

  • 我正在尝试在python中使用ECDSA验证比特币签名,但发现它非常困难,许多尝试已经失败了。 参数: 注意:我已经根据ECDSA的要求将签名从base64转换为hexstring。每当我试图验证它时,它会说: 预期64字节签名(128十六进制字符串),提供了65字节签名(130十六进制字符串) 我查看了许多关于ECDSA的stackoverflow问题,但没有一个答案与我的qs 100%相关。感

  • 我是从IDP接收SAML断言签名的服务提供商。我在Tomcat上使用JOSSO来使用断言。这里的问题是我无法验证断言签名。 IDP证书使用别名“IDP”上传到我的密钥库。 在验证sig时,我得到以下错误: 为什么JOSSO无法检测密钥库中的证书并验证签名?我需要以不同的方式定义别名吗?

  • 我试图使用javascript创建ECDSA算法的密钥对,签名消息,然后在服务器端验证它(使用Java)。 示例javascript代码: 例如: 我做错了什么?

  • 我传入以下内容(摘要/哈希是SHA1): 到此功能: 但我无法在OpenSSL中验证签名(verify_success为0),即使完全相同的数据在C#中验证成功。 关于我为什么或做错了什么的任何想法? C#中的公钥是: 我假设4543533120000000是。NET特定的东西,所以我只是把04前置到它的其余部分。 这是用于验证签名的C#代码,它成功地做到了(dataBytes的SHA1在两个程序