3

我正在尝试按照此链接的步骤获取仅限应用程序的身份验证令牌: 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 转换和字符串编码上。

我必须在 key+secret 组合中添加一个强制编码参数,以进行 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
4

1 回答 1

-2

您是否尝试使用 Tweeter(作为 OAuth 提供者)实施授权。我建议使用 OmniAuth,而不是按照 API 文档从头开始编写它。设置和样板代码相当容易使用。

在http://www.omniauth.org/https://github.com/intridea/omniauth/wiki了解更多信息

让我们知道,如果这对您有帮助。

于 2013-06-17T20:49:43.137 回答