2012-04-05 11 views
6

Rails 3.0.12、最新のomniauth、私はGoogleに接続してユーザのメールアドレスを取得できます。しかし、私は、SSLモードでnginxの背後にあるものと同じレールのアプリを実行し、そしてそれは、Googleのページで失敗します。SSLモードでnginxの背後で動作しているときにOmniauthとGoogleとopen_idが壊れた

"The page you requested is invalid." 

は、それは私のnginxの設定ファイルですか?私のomniauthの設定?

私はX-Forwarded-Proto: httpsがここに特別なタレで知って、私は、SSL Webサーバの背後にある幸せのOpenIDを取得するために行う必要が何かはありますか?

はここで完全なサンプルコードです:あなたはそれが失敗見てrake serverを実行し、このレポ、bundle installのクローンを作成し、それがうまく動作確認するためにrails sを実行することができます。 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; 
    } 
    } 
} 

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

routes.rbを:

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

UPDATE:レール3.1用いるこの例。 12とOmniAuth 1.0.3。 Rails 3.1.4およびOmniAuth 1.1.0にアップグレードすると、この問題は解決されます。

+0

Googleがあなたのサーバーに当たらないことは確かですか?テスト証明書を使用している場合は、Googleがその証明書を使用することを拒否する可能性があります。私はtcpdumpを実行して、接続を試みる前に接続が試みられたかどうかを確認します。 – Schmurfy

+0

Googleは決してローカルサーバーに "ヒット"しません - アプリは無効なURLにブラウザをリダイレクトします。私が掲示したサンプルコードを試してください、それはすぐに実行されます。 –

答えて

2

説明のために:ラックopenidの宝石は、Googleのopenidサーバーに送信する要求をビルドすると、レールアプリケーションのアクセスURLを使用して1つの場所で失敗し、これはopenidサーバーに送信されるnginxのもの(sslを使用する) :

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

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

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

+0

あなたの答えは、RackとOmniAuthのコードを深く掘り下げました。リクエストフェーズで "http"であるREQUEST_URIを見た後、Railsコードを掘りました。それでRails 3.1(私の例は3.0)を試してみました.OmniAuth 1.1.0へのアップグレードに伴い、すべて修正されました!私に正しい方向へ向かうことに感謝します。 –

+0

私は賞金のために少し遅れたように見えますが、私は助けることができてうれしいです:) – Schmurfy

0

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

rails sでのテスト用に複数のアプリケーションをセットアップし、別のステージング用のデプロイメントとプロダクションにデプロイするときに別のステージング用のデプロイメントを用意しました。

あなたのconfig /初期化子/ omniauth.rbでこれを追加します:

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

そして今、あなたの問題は、私はまだクリーンな何かを見つけるしようとしているが、ここにいることは、迅速&汚い修正ですが見つかり

+0

サーバを実行しよう - https://github.com/jjulian/open_id_ssl Googleは決してアプリケーションを呼び戻さないので、無効な初期URLが作成されます。 –

関連する問題