使用/1.1/statuses/update.json在自己的Twitter帐户上发布推文失败,无法对您进行身份验证

时间:2017-10-18 16:18:02

标签: http-post ruby-on-rails-5 twitter-oauth

逗人

我花了很多时间试图在我的网站上发布推文到我自己的Twitter用户帐户而不使用任何现成的解决方案。 该网站在app.twitter.com上获得了读/写访问权限,我重新生成了所有密钥。

我正在关注端点“POST /1.1/statuses/update.json”的Twitter API说明

我已经仔细检查了所有物品,但仍然在

response       =--- !ruby/object:Net::HTTPUnauthorized
http_version: '1.1'
code: '401'
message: Authorization Required
header:
  connection:
  - close
  content-length:
  - '89'
  content-type:
  - application/json; charset=utf-8
  date:
  - Wed, 18 Oct 2017 15:28:19 GMT
  server:
  - tsa_o
  set-cookie:
  - personalization_id="v1_pxDMvL5ZrViFDcn8AfFemw=="; Expires=Fri, 18 Oct 2019 15:28:19
    UTC; Path=/; Domain=.twitter.com
  - guest_id=v1%3A150834049962807489; Expires=Fri, 18 Oct 2019 15:28:19 UTC; Path=/;
    Domain=.twitter.com
  strict-transport-security:
  - max-age=631138519
  x-connection-hash:
  - '05228a7a2026efc93a8a2d4b1a8c6460'
  x-response-time:
  - '142'
  x-tsa-request-body-time:
  - '1'
body: '{"errors":[{"code":32,"message":"Could not authenticate you."}]}'
read: true
uri:
decode_content: true
socket:
body_exist: true

我想从我的网站发送一个简单的“Hello”到我的推特账户,并仔细检查下面将显示的所有部分。

此外,使用我的Twitter帐户在我的网站上使用相同的逻辑来验证我。所以我知道授权(3条腿)正常工作。

使用我的rails应用程序发布推文,我已尝试过两种方式:1)使用我的应用程序的消费者和访问令牌对发布推文,而无需执行所有授权步骤以及2)引导自己到Twitter以明确重新授权我的网站网站发布推文。两种情况都会导致错误401.除了实际的推特步骤外,一切正常。

非常感谢任何帮助。请注意,我对使用gem不感兴趣并且已经仔细阅读了相关的API文档。

我的帖子请求的所有组成部分:

Parameter String:    
include_entities=true&
oauth_consumer_key=Xffffffffffffffffffffffff&
oauth_nonce=1vGbvxCqsfGi47L7ecpRnwA33fEojFoy6J2hkRpa8&
oauth_signature_method=HMAC-SHA1&
oauth_timestamp=1508340584&
oauth_token=4444444444-GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG&
oauth_version=1.0&
status=Hello

signature base string:
POST&
https%3A%2F%2Fapi.twitter.com%2F1.1%2Fstatuses%2Fupdate.json&
include_entities%3Dtrue%26
oauth_consumer_key%3DXffffffffffffffffffffffff%26
oauth_nonce%3D1vGbvxCqsfGi47L7ecpRnwA33fEojFoy6J2hkRpa8%26
oauth_signature_method%3DHMAC-SHA1%26
oauth_timestamp%3D1508340584%26
oauth_token%3D4444444444-GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG%26
oauth_version%3D1.0%26
status%3DHello

signing key:
W6SzwsKSXwFpl8tb0UNJFoCTW6crf6p3JaS8GipJMErofZVLAA&ENxK6XHG8h2EI7dOeSL0fABJzqnzs7FhP6QirBbXvd0br

signature:
0zx68mHx/SxhHkoRpaqZmO8iC2s=

header string:
OAuth oauth_consumer_key="Xffffffffffffffffffffffff", 
oauth_nonce="1vGbvxCqsfGi47L7ecpRnwA33fEojFoy6J2hkRpa8", 
oauth_signature="0zx68mHx%2FSxhHkoRpaqZmO8iC2s%3D", 
oauth_signature_method="HMAC-SHA1", 
oauth_timestamp="1508340584", 
oauth_token="4444444444-GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG", 
oauth_version="1.0"


POST REQUEST
request        =--- !ruby/object:Net::HTTP::Post
method: POST
request_has_body: true
response_has_body: true
uri:
path: "/1.1/statuses/update.json?include_entities=true"
decode_content: true
header:
  content-type:
  - application/x-www-form-urlencoded
  authorization:
  - OAuth oauth_consumer_key="Xffffffffffffffffffffffff", oauth_nonce="1vGbvxCqsfGi47L7ecpRnwA33fEojFoy6J2hkRpa8",
    oauth_signature="0zx68mHx%2FSxhHkoRpaqZmO8iC2s%3D", oauth_signature_method="HMAC-SHA1",
    oauth_timestamp="1508340584", oauth_token="4444444444-GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG",
    oauth_version="1.0"
  host:
  - api.twitter.com
  accept-encoding:
  - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
  accept:
  - "*/*"
  user-agent:
  - Ruby
body: '{"status":"Hello"}'
body_stream:
body_data:

1 个答案:

答案 0 :(得分:0)

我终于开始工作了。存在几个问题。没有签名和授权标头。相反,所使用的时间戳中存在问题,这些问题未正确同步,也不像Twitter期望的那样在GMT中存在。我将系统时钟与time.google.com进行了同步,此部分已完成。现在,还有一个关于标题的问题也需要排序,这与twitter自己的文档只讨论在签名基本字符串的上下文中进行排序相反。我发现扩展头也需要排序。扩展,因为它包含不属于签名计算的推文本身。一旦这部分内容发布,推文就成功了