Twitter应用程序仅Auth

时间:2013-06-17 19:36:58

标签: ruby-on-rails twitter rest-client

我正在尝试按照此链接的步骤获取Application Only Auth令牌: https://dev.twitter.com/docs/auth/application-only-auth

我正在使用Ruby on Rails和Rest Client来提供所需的POST请求,而且我正在设置标题(我认为)。

一步一步说:

  

URL根据RFC编码使用者密钥和使用者密钥   1738.请注意,在撰写本文时,这实际上并不会更改消费者密钥和密钥,但仍应执行此步骤   如果这些值的格式在将来发生变化。

     

连接编码的使用者密钥,冒号字符“:”和   将消费者秘密编码为单个字符串。

     

Base64对上一步中的字符串进行编码。

我的代码是:

require 'rest_client'

    key = URI::encode('app_key')
    secret = URI::encode('app_secret')
    encoded = Base64.encode64("#{key}:#{secret}")

    res = RestClient::Resource.new "https://api.twitter.com/oauth2/token/"
    response = ''

    options = {}
    options['Authorization'] = "Basic #{encoded}"
    options['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'

    res.post('grant_type=client_credentials', options) do |response, request, result|
        response << "#{CGI::escapeHTML(response.inspect)}<br /><br />"
        response << "#{CGI::escapeHTML(request.inspect)}<br /><br />"
        response << "#{CGI::escapeHTML(result.inspect)}<br />"
    end

    render :text => txt

我打印出来:

"{\"errors\":[{\"label\":\"authenticity_token_error\",\"code\":99,\"message\":\"Unable to verify your credentials\"}]}"

#<RestClient::Request:0x9ece5d8 @method=:post, @headers={"Authorization"=>"Basic bXlfa2V5Om15X3NlY3JldA==\n", "Content-Type"=>"application/x-www-form-urlencoded;charset=UTF-8"}, @url="https://api.twitter.com/oauth2/token/", @cookies={}, @payload="", @user=nil, @password=nil, @timeout=nil, @open_timeout=nil, @block_response=nil, @raw_response=false, @verify_ssl=false, @ssl_client_cert=nil, @ssl_client_key=nil, @ssl_ca_file=nil, @tf=nil, @max_redirects=10, @processed_headers={"Accept"=>"*/*; q=0.5, application/xml", "Accept-Encoding"=>"gzip, deflate", "Authorization"=>"Basic bXlfa2V5Om15X3NlY3JldA==\n", "Content-Type"=>"application/x-www-form-urlencoded;charset=UTF-8", "Content-Length"=>"29"}, @args={:method=>:post, :url=>"https://api.twitter.com/oauth2/token/", :payload=>"grant_type=client_credentials", :headers=>{"Authorization"=>"Basic bXlfa2V5Om15X3NlY3JldA==\n", "Content-Type"=>"application/x-www-form-urlencoded;charset=UTF-8"}}>

#<Net::HTTPForbidden 403 Forbidden readbody=true>

我的密钥和秘密是有效的。 我错过了什么吗?

谢谢!


修改

使用我找到的解决方案进行更新。

问题出在Base64转换和字符串编码上。

我必须为密钥+秘密组合添加强制编码参数,用于UTF-8转换:

encoded = Base64.encode64("#{key}:#{secret}".force_encoding('UTF-8'))

Rails Base64.encode64每60个编码字符插入换行符。

解决方法是:

对于Ruby 1.9+(strict_包含在Ruby 1.9中)

Base64.strict_encode64(string)

对于Ruby 1.9 -

Base64.encode64(string).gsub('/\n/') # To remove the line break

1 个答案:

答案 0 :(得分:-2)

您是否尝试使用Tweeter(作为OAuth提供程序)实施授权。我建议使用OmniAuth,而不是在API文档之后从头开始编写它。设置&amp;样板代码相当容易使用。

http://www.omniauth.org/&amp; https://github.com/intridea/omniauth/wiki

如果这有助于您,请告诉我们。