3

私のコンピューターとサーバーで問題なく動作する Ruby on Rails アプリケーションがあります。このアプリケーションを、別のホスティング サービスで実行される別のサーバーに移動しようとしていますが、OAuth Ruby Gem に関連する問題が発生しました。

OAuth gem を使用して行うすべてのリクエストは、次のようになります。

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'
  ...

私のコードは次のとおりです。

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

問題は、同じコードが私のコンピューターと別のサーバーでうまく機能することです。これは、1 つのサーバーでのみ発生します。ファイアウォールに関連するもの、または OAuth 呼び出しをブロックできるものはありますか?

このエラーを何度も検索しましたが、答えが得られませんでした。そのため、ここで質問しています。

ありがとう。

4

6 に答える 6

1

私の Twitter コンシューマ キーとシークレットは config/application.yml にあり、このファイルは .gitignore にリストされていたため、Heroku にプッシュされていませんでした。その結果、この 401 エラーは、アプリの資格情報が欠落していたため、Twitter OAuth から表示されていました。解決策は、.gitignore ファイルで、Twitter (または別の OAuth プロバイダー) アプリの資格情報を含む構成ファイルに言及している行を見つけることでした。.gitignore から行を削除した後、次のようにします。

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

Heroku を使用している場合は、次のことができます。

git push heroku master

うまくいけば、これはうまくいくはずです。

于 2013-05-08T02:32:27.837 に答える
0

私の推測では、時間の偏りがあります。ntpdateを使用してクロックを同期してみてください(一般的にntpを使用することもお勧めします)。

于 2010-11-20T16:25:13.333 に答える
0

ごめん。サーバーにインストールされているgem:

root@server1:~# 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)

サーバーのRubyバージョン:

root@server1:~# ruby -v
ruby 1.8.7 (2010-01-10 patchlevel 249) [x86_64-linux]

助けてくれてありがとう。

于 2010-10-06T02:35:29.763 に答える
0

OK、これが動作中のサーバー gem と Ruby のバージョンです。

宝石:

root@phcf:/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)

ルビーのバージョン:

root@phcf:/www/rails# ruby -v
ruby 1.8.7 (2008-08-11 patchlevel 72) [x86_64-linux]
于 2010-10-06T16:28:15.530 に答える
0

OAuth::Unauthorized例外をレスキューし、ラップされた応答を調べてみてください。何かのようなもの:

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

OAuth プロバイダーは、送信する 401 応答に追加情報を追加する場合があります。リクエスト トークン リクエストの 401 は、私には少し奇妙に思えますが、oauth の仕様ではそれについてある程度説明されています。

私が持っている疑いの 1 つは、使用しようとしているホスティング サービスが、不適切な動作のためにプロバイダーによってブロックされている可能性があるということです。その場合、あなたはそれについて彼らと話す必要があります.

しかし、それ以上の情報がなければ、その理由を正確に知ることはできません。

于 2010-10-06T16:57:50.897 に答える
0

試しているサーバー環境では、OAuth サーバーが内部アドレスとポートを持っているのに対し、OAuth クライアントは外部のルーティング可能なアドレスだけを参照する、ある種のリバース プロキシ設定を使用している可能性があります。

これにより、クライアントとサーバーで異なる署名ベース文字列が生成されるため、検証中に認証エラーが発生します!

開発環境ではすべてが正常に機能するが、非常に異なるネットワーク設定 (DMZ など) がある本番環境では失敗するという同様の問題がセットアップで発生しました。

Nginx を使用しているため、解決策は、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; 
     }
     ....
  }

ただし、最初にサーバーのクロックも確認してください。NTP はあなたの味方です。

于 2010-12-08T10:42:53.860 に答える