6

Rails 3.0.12、最新の omniauth、Google に接続してユーザーのメール アドレスを取得できます。しかし、SSL モードで nginx の背後で同じ Rails アプリを実行すると、Google ページで失敗します。

"The page you requested is invalid."

それは私のnginx設定ですか?私のomniauthのセットアップ?

X-Forwarded-Proto: httpsはここで特別なソースであることを知っています.SSL Webサーバーの背後でopenidを満足させるために他に何かする必要がありますか?

完全なサンプル コードは次のとおりです。このリポジトリを複製しbundle install、実行rails sして正常に動作することを確認してから、実行rake serverして失敗することを確認できます。 https://github.com/jjulian/open_id_ssl

nginx.conf:

worker_processes  2;
pid        tmp/nginx.pid;
error_log  log/error.log;
daemon     off;

events {
}

http {
  client_body_temp_path tmp/body;
  proxy_temp_path       tmp/proxy;
  fastcgi_temp_path     tmp/fastcgi;
  uwsgi_temp_path       tmp/uwsgi;
  scgi_temp_path        tmp/scgi;

  server {
    listen 3000 ssl;
    ssl_certificate      development.crt;
    ssl_certificate_key  development.key;
    ssl_verify_depth     6;

    access_log log/access.log;
    proxy_buffering off;
    location / {
      proxy_pass        http://127.0.0.1:3300;
      proxy_set_header  X-Real-IP        $remote_addr;
      proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
      proxy_set_header  Host             $http_host;
      proxy_redirect    off;
      proxy_set_header  X-Forwarded-Proto https;
    }
  }
}

omn​​iauth.rb 初期化子:

require 'openid/store/filesystem'

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :open_id, :identifier => 'https://www.google.com/accounts/o8/id'
end

ルート.rb:

OpenIdSsl::Application.routes.draw do
  match '/auth/open_id/callback' => 'accounts#update'
  match '/auth/failure' => 'accounts#failure'
  root :to => 'accounts#show'
end

更新:この例では、Rails 3.1.12 と OmniAuth 1.0.3 を使用しました。Rails 3.1.4 および OmniAuth 1.1.0 にアップグレードすると、この問題が修正されます。

4

2 に答える 2

2

あなたの問題を見つけました。私はまだ何かきれいなものを見つけようとしていますが、ここに簡単で汚い修正があります:

これを config/initializers/omniauth.rb に追加します:

class Rack::OpenID
  def realm_url(req)
    'https://localhost:3000'
  end
end

ここで説明します。rack-openid gem がリクエストをビルドして google openid サーバーに送信すると、nginx のアクセス URL (ssl を使用) ではなく Rails アプリケーションのアクセス URL を使用して 1 つの場所で失敗し、これがopenid サーバー:

openid.realm:http://localhost:3001
openid.return_to:https://localhost:3001/auth/open_id/callback

レルムは http url (rails url) を使用しますが、return_to は正しい https url (nginx) を指します。openid サーバーがこれを確認すると、停止してエラーを返します。

PS:よりクリーンな方法を見つけることができれば、回答を編集します。

于 2012-04-17T08:42:21.303 に答える
0

ほとんどの場合、Google アプリのコールバック URL を構成して、http の代わりに https を追加する必要があります。

rails sテスト用に 1 つ、ステージング デプロイ用に 1 つ、本番環境にデプロイするとき用に1 つ、複数のアプリをセットアップしています。

于 2012-04-15T20:12:39.377 に答える