我正在尝试按照此链接的步骤获取仅限应用程序的身份验证令牌: 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