2011-01-12 7 views
10

Ich verwende OAuth-Ruby, um eine OAuth-Authentifizierung mit einer Tumblr-Anwendung durchzuführen. Ich kann Code schreiben, der die verschiedenen Schritte von OAuth durchläuft, aber ich kann kein Zugriffstoken erhalten oder eine Anfrage stellen. Ich kann einen Anforderungsschlüssel abrufen, den Benutzer zu Tumblr umleiten, um den Zugriff zu authentifizieren und zu gewähren, und einen authentifizierten Anforderungsschlüssel erhalten. Aber ich kann nicht weiter kommen.Abrufen eines Access Token mit OAuth-Ruby und Tumblr API (Rails 3)

Ich habe meine Tumblr-Anwendung registriert; Lassen Sie sich für diese Frage davon aus, dass es mir mit den folgenden Tasten zur Verfügung gestellt hat:

  • OAuth-Consumer-Key: @oauth_consumer_key
  • Secret Key: @secret_key

(Ich habe Istwerten, aber ich bin sie verborgen hier aus offensichtlichen Gründen haltend)

ich verwende den folgenden Code in einem Controller, der ausgeführt wird, wenn der Benutzer ein Formular abschickt, die Informationen speichern, in der @tumblog Variable bilden.

#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 

Dieser Code bringt mich auf die richtige Seite bei Tumblr, wo der Benutzer gewährt oder verweigert meine Anwendung Zugriff auf das Benutzerkonto. Angenommen, der Benutzer gewährt Zugriff, Tumblr leitet zurück zu meiner Anwendung zu einem Rückruf, den ich bei der Registrierung der Anwendung mit Tumblr bereitgestellt habe. Bis zu diesem Punkt funktioniert alles wunderbar.

Mein OAuth Rückruf läuft den folgenden Code in der Steuerung:

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 

In Schritt 3 gibt es ein Problem. Ich kann nicht scheinen, um tatsächlich einen Zugriffstoken mit der Linie zu erhalten:

@access_token = @request_token.get_access_token 

Kann mir jemand sagen, was ich tun muß, um das Zugriffstoken zu bekommen? Wenn ich diese Zeile führe, erhalte ich einen OAuth :: Unauthorized-Fehler.

Ich schätze wirklich jeden Rat. Ich habe mehrere Tage lang gegoogelt und verschiedene Dinge ausprobiert. Vielen Dank!

+3

Natürlich, jetzt habe ich es gerade herausgefunden nach der Einlieferung. Für andere, die sich möglicherweise in einem ähnlichen Boot befinden, besteht das Problem darin, dass die OAuth-Implementierung von Tumblr den OAuth_Verifier-Schlüssel erwartet, den er an den von Ihnen bereitgestellten OAuth-Callback übergibt. Der Code @access_token = @ request_token.get_access_token muss also in @access_token = @ request_token.get_access_token ({: oauth_verifier => params [: oauth_verifier]}) geändert werden. –

+0

Wow, das hat mir sehr geholfen. Tumblr sollte dies auf seiner API-Seite erwähnen, da ich ein paar gute Stunden damit verschwendet habe, genau dieses Problem herauszufinden. – dreadpirateryan

Antwort

2

i verwenden Pelle's oauth plugin und modifiziert es ein wenig xauth wie diese zu unterstützen:

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 
+1

Es bleibt hängen und reagiert nicht. Können Sie bitte bestätigen, dass Ihr Code für Sie funktioniert? – defhlt