2011-01-12 71 views
10

我正在使用OAuth-Ruby对Tumblr应用程序进行OAuth身份验证。我能够编写通过OAuth的各个步骤前进的代码,但我无法获取访问令牌或实际发出请求。我可以获取请求密钥,将用户重定向到Tumblr以进行身份​​验证并授予访问权限,并接收经过身份验证的请求密钥。但我无法获得更远的进展。使用OAuth-Ruby和Tumblr API获取访问令牌(Rails 3)

我已经注册了我的Tumblr应用程序;让我们假设这个问题,它为我提供了以下项:

  • OAuth用户密钥:@oauth_consumer_key
  • 的密钥:@secret_key

(我有实际价值,但我)

我在用户提交表单时在运行的控制器中运行以下代码,该表单在@tumblog变量中存储信息:

#0. provided when registering application 
@key = @oauth_consumer_key 
@secret = @secret_key 
@site = 'http://www.tumblr.com' 
@consumer = OAuth::Consumer.new(@key, @secret, 
           { :site => @site, 
           :request_token_path => '/oauth/request_token', 
           :authorize_path => '/oauth/authorize', 
           :access_token_path => '/oauth/access_token', 
           :http_method => :post }) 
if @consumer 
    #1. get a request token 
    @request_token = @consumer.get_request_token; 
    session[:request_token] = @request_token 
    session[:tumblog] = @tumblog 

    #2. have the user authorize 
    redirect_to @request_token.authorize_url 
else 
    flash[:error] = "Failed to acquire request token from Tumblr." 
    render 'new' 
end 

此代码让我访问Tumblr的正确页面,在此用户授予或拒绝我的应用程序访问用户帐户。假设用户授予访问权限,Tumblr将重定向回我的应用程序,到我在Tumblr注册应用程序时提供的回调。到那时,一切都很好。

我的OAuth回调运行在控制器以下代码:

if params[:oauth_token] && params[:oauth_verifier] 
    @tumblog = session[:tumblog] 
    @request_token = session[:request_token] 

    #3. get an access token 
    @access_token = @request_token.get_access_token 

    . . . . 
end 

在步骤3中,有一个问题。我似乎无法真正与线得到一个访问令牌:

@access_token = @request_token.get_access_token 

谁能告诉我什么,我需要做的就是访问令牌?当我运行该行时,出现OAuth :: Unauthorized错误。

我真的很感谢任何建议。我一直在谷歌搜索和多天尝试不同的事情。谢谢!

+3

当然,现在我已经想通了。为了让其他可能会遇到类似问题的人受益,问题在于Tumblr OAuth实现期望将oauth_verifier密钥传递给您提供的OAuth回调。因此,代码@access_token = @ request_token.get_access_token需要更改为@access_token = @ request_token.get_access_token({:oauth_verifier => params [:oauth_verifier]})。 – 2011-01-12 21:43:24

+0

哇,这帮了我很多。 Tumblr应该在他们的API页面上提及这一点,因为我浪费了好几个小时试图弄清楚这个确切的问题。 – dreadpirateryan 2011-08-09 03:30:24

回答

2

我使用​​和修改了一些支持XAUTH这样的:刚发布后

require 'rubygems' 
require 'oauth' 

CONSUMER_KEY = 'YOUR_CONSUMER_KEY' 
CONSUMER_SECRET = 'YOUR_CONSUMER_SECRET' 

consumer = OAuth::Consumer.new(CONSUMER_KEY, CONSUMER_SECRET, :site => 'https://www.tumblr.com/oauth/access_token') 
access_token = consumer.get_access_token(nil, {}, { :x_auth_mode => 'client_auth', 
                :x_auth_username => "[email protected]", 
                :x_auth_password => "password"}) 
tumblr_credentials = access_token.get('http://www.tumblr.com/api/authenticate') 

puts access_token 
puts access_token.token 
puts access_token.secret   
puts tumblr_credentials.body