我正在使用Rhomobile(适用于Android)在Twitter上发布状态更新。为此,按照Oauth实现的步骤,我可以使用Twitter登录,但在登录后,每次尝试发布状态更新时,我都会将HTTP响应发送为{"errors":[{"message":"Could not authenticate you","code":32}]}
。
以下是发布状态更新请求的相关代码。
def post_to_twitter(comment)
$rnd = rand(36**32).to_s(36)
$post_status_url = "https://api.twitter.com/1.1/statuses/update.json"
$oauth_token1 = @account_set.tt_oauth_token
$oauth_token_secret1 = @account_set.tt_oauth_token_secret
@oauth_nonce = $rnd
@oauth_timestamp = Time.now.to_i.to_s
@http_port = System.get_property('rhodes_port')
@url_param = "oauth_consumer_key="+ $oauth_consumer_key + "&" +
"oauth_nonce=" + @oauth_nonce + "&" +
"oauth_signature_method=" + $oauth_signature_method + "&" +
"oauth_timestamp=" + @oauth_timestamp + "&" +
"oauth_token=" + $oauth_token1 + "&" +
"oauth_version="+ $oauth_version + "&" +
"status=" + Rho::RhoSupport.url_encode("Test")
$oauth_sign = get_auth_signature($post_status_url, @url_param, "")
@auth_header = "OAuth oauth_consumer_key="+ $oauth_consumer_key + ", " +
"oauth_nonce=" + @oauth_nonce + ", " +
"oauth_signature=" + $oauth_sign + ", " +
"oauth_signature_method=" + $oauth_signature_method + ", " +
"oauth_timestamp=" + @oauth_timestamp + ", " +
"oauth_token=" + $oauth_token1 + ", " +
"oauth_version="+ $oauth_version + ", " +
"status=" + Rho::RhoSupport.url_encode("Test")
postTTres = Rho::AsyncHttp.post(
:url => $post_status_url,
:headers =>{"Content-Type" => "application/x-www-form-urlencoded", "Authorization" => @auth_header }
)
p postTTres
end
签名生成功能如下:
def get_auth_signature (url, url_param, secret)
signature = "POST&" + Rho::RhoSupport.url_encode(url).to_s +
"&" + Rho::RhoSupport.url_encode(url_param).to_s
key = $oauth_consumer_secret + "&" + secret
hmac = HMAC::SHA1.new(key)
hmac.update(signature)
$signature = Base64.encode64("#{hmac.digest}")
$signature = Rho::RhoSupport.url_encode("#{$signature.gsub(/\n/,'')}")
return $signature
end
跟踪时的参数值如下:
生成签名之前@url_param ---------
oauth_consumer_key = 2ChmEzWBe5Y9hMYODqA1IQ&安培; oauth_non CE = iyb9502vspjnhj9orb87sriych16678b&安培; oauth_signature_method = HMAC-SHA1&安培; oauth_timestamp = 1380117614&安培;组oauth_token = 244586214-M6A2jMlR7vZiqwAMrfuSj7I7XFzFTRd4 6nV6aTLK&安培; oauth_version = 1.0&安培;状态= Test`
将@url_param
传递给get_auth_signature()
以生成签名。
生成的签名URL和签名是
签名字符串----------
POST&安培; HTTPS%3A%2F%2Fapi.twitter.com%2F1.1%2Fstatuses%2Fupdate。 JSON&安培; oauth_consumer_key%3D2ChmEzWBe5Y9hMYODqA1IQ%26oauth_nonce%3Diyb9502vspjnhj9orb87sriych16678b%26oauth_signature_method%3DHMAC-SHA1%26oauth_timesta 熔点%3D1380117614%26oauth_token%3D244586214-M6A2jMlR7vZiqwAMrfuSj7I7XFzFTRd46nV6aTLK%26oauth_version%3D1.0%26status%3DTest“`
Base64字符串-------
gjdXuU3qoGNt90Q2dRhNM3IXaBI%3D
将所有这些值作为标题授权传递给https://api.twitter.com/1.1/statuses/update.json
得到了
Http响应为{"errors":[{"message":"Could not authenticate you","code":32}]}
。
还尝试将其作为帖子参数传递给:body但没有运气。
postTTres = Rho::AsyncHttp.post(
:url => $post_status_url,
:headers =>{"Content-Type" => "application/x-www-form-urlencoded"},
:body => @url_param + "&oauth_signature=" + $oauth_sign
)
使用Twitter服务器时间检查系统时间,没关系。
还尝试使用静态oauth_token我们可以从Twitter帐户获取,但后来响应相同。
请帮我解决这个问题。我无法追查我所缺少的或我出错的地方。
由于
答案 0 :(得分:0)
两件事:
“status”参数是普通的post数据参数,不应该在授权标题中,请参阅https://dev.twitter.com/docs/api/1.1/post/statuses/update
API 1.1存在一个奇怪的问题,编码特殊字符(例如%20表示“”)。以下是为我做的:url对签名输入的“status”内容进行编码,不对帖子数据本身进行编码。
编辑:
您忘记提供与user_token对应的秘密:
$oauth_sign = get_auth_signature($post_status_url, @url_param, "")
当您通过https://api.twitter.com/oauth/access_token从Twitter获得访问令牌时,Twitter会使用auth_token和auth_token_secret(以及id和screen_name)进行回复。你在params中正确提供了auth_token(从而提供了签名),但你应该提供你当前放置“”的auth_token_secret。
编辑2:
以上编辑让我想知道:您是否使用https://api.twitter.com/oauth/access_token获得了访问令牌?因为你应该使用oauth_token_secret作为从twitter到提供给https://api.twitter.com/oauth/request_token的回调网址的调用中的参数。此回调网址称为对通过https://api.twitter.com/oauth/authorize确认用户的响应。对于https://api.twitter.com/oauth/request_token,您可以使用“”作为秘密,因为在该阶段还没有auth_token(因此没有相应的秘密)。