40 votes

Je continue à obtenir l'erreur OAuth::Unauthorized lorsque j'utilise les gemmes ruby oauth et twitter.

J'utilise la gemme ruby twitter et oauth pour avoir accès aux comptes twitter des utilisateurs. Dans mon code, j'ai :

unless @user.twitter_authd?
      oauth = Twitter::OAuth.new('token', 'secret')
      session[:twitter_request_token] = oauth.request_token.token
      session[:twitter_request_secret] = oauth.request_token.secret
      @twitter_auth_url = oauth.request_token.authorize_url
    end

où token et secret contiennent mon token et mon secret réels. Lorsque je clique sur le lien vers l'adresse @twitter_auth_url, je suis dirigé vers twitter et on me demande d'autoriser l'accès. Je clique sur autoriser et ensuite twitter me redirige vers mon URL de rappel. http://www.mydomain.com/twitter_callback/?oauth_token=fmy2aMvnjVgaFrz37bJ4JuB8r5xN79gsgDQRG4BNY qui frappe alors ce code :

oauth = Twitter::OAuth.new('token', 'secret')

    logger.info("session[:twitter_request_token] = #{session[:twitter_request_token]}")
    logger.info("session[:twitter_request_secret] = #{session[:twitter_request_secret]}")

    oauth.authorize_from_request(session[:twitter_request_token], session[:twitter_request_secret])
    session[:twitter_request_token] = nil
    session[:twitter_request_secret] = nil

    @user.update_attributes({
      :twitter_token => oauth.access_token.token, 
      :twitter_secret => oauth.access_token.secret,
    })

    redirect_to root_path

Le jeton de demande et le secret de Twitter sont bien définis. Cependant, je me retrouve avec une erreur d'autorisation :

 OAuth::Unauthorized in MainController#twitter_callback

401 Unauthorized

RAILS_ROOT: /Users/TAmoyal/Desktop/RoR_Projects/mls
Application Trace | Framework Trace | Full Trace

/Library/Ruby/Gems/1.8/gems/oauth-0.3.4/lib/oauth/consumer.rb:167:in `token_request'
/Library/Ruby/Gems/1.8/gems/oauth-0.3.4/lib/oauth/tokens/request_token.rb:14:in `get_access_token'
/Library/Ruby/Gems/1.8/gems/erwaller-twitter-0.6.13.1/lib/twitter/oauth.rb:29:in `authorize_from_request'
/Users/TAmoyal/Desktop/RoR_Projects/mls/app/controllers/main_controller.rb:70:in `twitter_callback'

Le code échoue à cette ligne :

oauth.authorize_from_request(session[:twitter_request_token], session[:twitter_request_secret])

quand il essaie d'obtenir un jeton d'accès. Vous pouvez voir le code source de authorize_from_request aquí . Je ne sais pas pourquoi cela se produit. Quelqu'un a-t-il une idée ?

78voto

George Palmer Points 681

J'arrive un peu tard dans la soirée mais je viens de rencontrer le même problème. J'ai trouvé le problème dans la configuration de mon application OAuth dans Twitter. Je n'avais initialement pas spécifié d'URL de rappel car je n'en étais pas sûr.

Une fois que j'ai configuré mon application rails, je suis revenu en arrière pour constater que Twitter avait supposé que j'étais une application de bureau car je n'avais pas spécifié d'URL de rappel. Une fois que j'ai changé cela en site web et que j'ai entré une URL de rappel, je n'ai plus eu de 400.

28voto

Hatem Mahmoud Points 351

Si vous obtenez l'erreur 401 - OAuth::Unauthorized, assurez-vous de modifier les paramètres de votre application Twitter comme suit :

8voto

Rabia Points 71

Il s'agit d'un problème de synchronisation de l'heure de votre système avec le serveur twitter.

7voto

naomik Points 10423

Twitter ne permet pas localhost dans le cadre d'une URL de rappel valide.

Utilisez plutôt http://127.0.0.1:3000/auth/twitter/callback

J'espère que cela vous aidera

4voto

Tony Points 6793

C'est l'une des choses les plus ennuyeuses à déboguer que j'ai rencontrées. Je produisais des résultats à plusieurs endroits par accident parce que les URL sont dynamiques et qu'elles ne sont pas définies dans mon scénario de test (je l'utilise pour afficher des données graphiques et il n'y en a pas assez en ce moment, donc les URL de l'api Google Chart sont vides). Cela a fait que mon navigateur a fait de multiples requêtes à mon hôte local lorsque certaines pages ont été chargées. D'une manière ou d'une autre, cela a fait échouer le processus oauth. Il est évident qu'il n'y a aucun moyen pour les gens du S.O. de connaître le problème spécifique de mon application, j'ai donc dû répondre à ma propre question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X