2011-01-12 83 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