2010-10-06 5 views
3

J'ai une application Ruby on Rails qui fonctionne très bien sur mon ordinateur et sur mon serveur. Je déplace cette application vers un autre serveur qui fonctionne sur un autre service d'hébergement, et j'ai eu un problème lié à l'OAuth Ruby Gem.Ruby on Rails L'application OAuth fonctionne sur le client mais pas sur le serveur (OAuth :: Unauthorized (401 Unauthorized))

Toute demande Je n'utilisant gem OAuth, je reçois:

OAuth::Unauthorized (401 Unauthorized): 
    oauth (0.4.3) lib/oauth/consumer.rb:217:in `token_request' 
    oauth (0.4.3) lib/oauth/consumer.rb:139:in `get_request_token' 
    ... 

Mon code est:

def self.consumer 
    # The readkey and readsecret below are the values you get during registration 
    OAuth::Consumer.new("XXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "YYYYYYYYYYYYYYYYYYYYYYYYYYYY", {:site => "http://api.twitter.com"}) 
end 

def create_authorize_url 
    @request_token = UserController.consumer.get_request_token(:oauth_callback => "http://mysite.com/callback") 
    session[:request_token] = @request_token.token 
    session[:request_token_secret] = @request_token.secret 

    redirect_to @request_token.authorize_url 
end 

Le problème est que le même code fonctionne bien sur mon ordinateur et dans un autre serveur. Cela n'arrive que sur un serveur. Y a-t-il quelque chose en rapport avec le pare-feu ou quelque chose qui peut bloquer les appels OAuth?

J'ai beaucoup cherché cette erreur et je n'ai pas eu de réponse, et c'est pourquoi je demande ceci ici.

Merci.

Répondre

0

Désolé. Les pierres précieuses installées sur le serveur:

[email protected]:~# gem list 

*** LOCAL GEMS *** 

actionmailer (2.3.8) 
actionpack (2.3.8) 
activerecord (2.3.8) 
activeresource (2.3.8) 
activesupport (3.0.0, 2.3.8) 
addressable (2.2.1) 
builder (2.1.2) 
facebook_oauth (0.2.0) 
faraday (0.4.6) 
ffi (0.6.3) 
hpricot (0.8.2) 
json (1.2.4) 
mime-types (1.16) 
multi_json (0.0.4) 
oauth (0.4.3, 0.3.5) 
oauth2 (0.0.13) 
rack (1.1.0) 
rails (2.3.8) 
rake (0.8.7) 
ruby-hmac (0.4.0) 
ruby-mysql (2.9.3) 
rubygems-update (1.3.7) 
sqlite3-ruby (1.3.1) 
tmail (1.2.7.1) 
twitter_oauth (0.4.3) 

Version Ruby serveur:

[email protected]:~# ruby -v 
ruby 1.8.7 (2010-01-10 patchlevel 249) [x86_64-linux] 

Merci de nous aider.

0

Ok, voici les gems du serveur de travail et la version Ruby.

Gems:

[email protected]:/www/rails# gem list 

*** LOCAL GEMS *** 

aaronp-frex (1.0.1) 
actionmailer (2.3.8, 2.3.5) 
actionpack (2.3.8, 2.3.5) 
activerecord (2.3.8, 2.3.5) 
activeresource (2.3.8, 2.3.5) 
activesupport (2.3.8, 2.3.5) 
addressable (2.2.1) 
chronic (0.2.3) 
configuration (1.1.0) 
daemons (1.0.10) 
eventmachine (0.12.10) 
facebook_oauth (0.2.0) 
faraday (0.4.6) 
fastthread (1.0.7) 
gemcutter (0.5.0) 
gruff (0.3.6) 
heroku (1.10.8, 1.9.13) 
highline (1.5.2) 
hoe (2.5.0) 
hpricot (0.8.2) 
json (1.2.2) 
json_pure (1.2.3) 
launchy (0.3.7) 
mime-types (1.16) 
multi_json (0.0.4) 
mysql (2.8.1) 
net-sftp (2.0.4) 
net-ssh (2.0.23) 
nokogiri (1.4.1) 
oauth (0.4.3) 
oauth2 (0.0.13) 
passenger (2.2.9) 
pastiepacker (1.1.1) 
rack (1.1.0, 1.0.1) 
rails (2.3.8, 2.3.5) 
rake (0.8.7) 
rest-client (1.4.2) 
rmagick (2.12.2) 
rubyforge (2.0.4) 
rubygems-update (1.3.5) 
shared-mime-info (0.1) 
steam-condenser (0.10.0, 0.9.0) 
thin (1.2.5) 
tmail (1.2.7.1) 
twitter_oauth (0.4.3) 
unicorn (0.96.1) 
xmpp4r (0.5) 
xmpp4r-simple (0.8.8) 

Version Ruby:

[email protected]:/www/rails# ruby -v 
ruby 1.8.7 (2008-08-11 patchlevel 72) [x86_64-linux] 
0

Essayez sauver l'exception OAuth::Unauthorized et inspecter sa réponse emballé. Quelque chose comme:

def create_authorize_url 
    @request_token = UserController.consumer.get_request_token(:oauth_callback => "http://mysite.com/callback") 
    session[:request_token] = @request_token.token 
    session[:request_token_secret] = @request_token.secret 

    redirect_to @request_token.authorize_url 
rescue OAuth::Unauthorized => e 
    logger.error e.response.inspect 
end 

Le fournisseur OAuth peut ajouter des informations supplémentaires dans la réponse 401 qu'ils vous envoient. Un 401 sur une demande de jeton de demande me semble un peu étrange, mais le oauth spec does talk about it some. Un des soupçons que j'ai est que le service d'hébergement que vous cherchez à utiliser peut être bloqué par le fournisseur en raison d'un mauvais comportement. Dans ce cas, vous devez leur en parler. Mais, nous ne pouvons pas vraiment savoir pourquoi sans plus d'informations.

+0

La réponse de l'API de Twitter est "Impossible de valider la signature et le jeton oauth". Le problème semble être dans la génération de la requête HTTP. Une idée, les gens? Merci. –

+0

Avez-vous regardé cet article: http://blainegarrett.com/2009/07/14/failed-to-validate-oauth-signature-and-token-on-twitter-oauth-check-your-cloc/ * tl ; dr * vos signatures seront erronées si votre horloge est loin de celle de Twitter. – BaroqueBobcat

0

Je pense qu'il y a un décalage temporel. Essayez de synchroniser l'horloge en utilisant ntpdate (et en utilisant ntp en général, c'est aussi une bonne idée).

0

Il se peut très bien que l'environnement serveur sur lequel vous l'essayez utilise une sorte de configuration de proxy inverse où le serveur OAuth a une adresse interne et un port alors que votre client OAuth ne verra que l'adresse routable externe. Cela entraînera différentes chaînes de base de signature sur le client et le serveur et, par conséquent, vous donnera une erreur d'autorisation lors de la vérification!

Nous avons eu des problèmes similaires dans notre configuration où tout fonctionne correctement dans les environnements de développement mais échoue en production où nous avons une configuration réseau très différente (DMZ, etc.).

Comme nous utilisons Nginx la solution était de passer l'hôte externe au serveur d'applications internes utilisant la directive proxy_set_header:

server { 
    # The external IP 
    listen x.x.x.x; 
    ... 
    location /api { 
     # Internal app server 
     proxy_pass http://192.168.1.100:4000; 

     # Pass the external IP to the app server 
     proxy_set_header Host $host; 
    } 
    .... 
    } 

Mais aussi vérifier vos horloges de serveur d'abord, NTP est votre ami.

1

J'ai trouvé que ma clé de consommateur et mon secret Twitter se trouvaient dans config/application.yml et que ce fichier était répertorié dans .gitignore, car il n'était pas transmis à Heroku. Par conséquent, cette erreur 401 apparaissait sur Twitter OAuth car les informations d'identification de l'application étaient manquantes. La solution consistait à trouver la ligne dans le fichier .gitignore qui mentionne tout fichier de configuration contenant les informations d'identification de votre application Twitter (ou celle d'un autre fournisseur OAuth). Après avoir enlevé la ligne de .gitignore, faire

git add . 
git commit -m "Added back configuration files for OAuth provider" 

et si vous êtes sur Heroku, vous pouvez alors faire

git push heroku master 

et espérons-le, cela devrait fonctionner.

Questions connexes