2012-04-05 28 views
6

Rails 3.0.12, omniauth mới nhất, tôi có thể kết nối với Google và nhận địa chỉ email của người dùng tốt. Nhưng sau đó tôi chạy cùng đường ray ứng dụng đằng sau nginx trong chế độ SSL, và nó không thành công với trang Google:Omniauth và open_id với Google bị hỏng khi chạy sau nginx ở chế độ SSL

"The page you requested is invalid." 

Có cấu hình nginx của tôi? Thiết lập omniauth của tôi?

Tôi biết X-Forwarded-Proto: https là loại sốt đặc biệt ở đây, có bất kỳ điều gì khác tôi cần làm để có được sự cởi mở hạnh phúc phía sau máy chủ web SSL không?

Dưới đây là mã ví dụ đầy đủ: bạn có thể sao chép repo này, bundle install và chạy rails s để xem nó hoạt động tốt, sau đó chạy rake server để xem lỗi. 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 initializer:

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: Ví dụ này sử dụng Rails 3.1. 12 và OmniAuth 1.0.3. Nâng cấp lên Rails 3.1.4 và OmniAuth 1.1.0 khắc phục sự cố.

+0

Bạn có chắc chắn rằng Google không truy cập máy chủ của bạn không? nếu bạn đang sử dụng chứng chỉ kiểm tra, Google có thể từ chối sử dụng nó. Tôi sẽ chạy một tcpdump để kiểm tra xem có bất kỳ nỗ lực kết nối được thực hiện trước khi đi xa hơn. – Schmurfy

+0

Google không bao giờ "truy cập" máy chủ cục bộ - ứng dụng tạo ra một chuyển hướng trình duyệt đến một url không hợp lệ. Hãy thử mã ví dụ tôi đăng, nó chạy ngay ra khỏi hộp. –

Trả lời

2

Tìm thấy vấn đề của bạn, tôi vẫn đang cố gắng để tìm một cái gì đó bụi nhưng ở đây là nhanh chóng & sửa chữa bẩn:

thêm này trong cấu hình của bạn/initializers/omniauth.rb:

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

Và bây giờ để giải thích: khi đá quý rack-openid xây dựng yêu cầu gửi tới máy chủ google openid, nó không thành công ở một chỗ bằng url truy cập ứng dụng đường ray chứ không phải nginx (sử dụng ssl) dẫn đến việc gửi tới máy chủ openid :

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

Lĩnh vực sử dụng url http (đường dẫn url) trong khi return_to trỏ tới url https đúng (nginx), khi máy chủ openid thấy nó dừng lại và trả về lỗi.

PS: Tôi sẽ chỉnh sửa câu trả lời nếu tôi quản lý để tìm một cách rõ ràng hơn.

+0

Câu trả lời của bạn giúp tôi tìm hiểu sâu hơn về mã Rack và OmniAuth và sau khi xem REQUEST_URI là "http" trong giai đoạn yêu cầu, tôi tìm hiểu mã Rails. Điều đó khiến tôi thử Rails 3.1 (ví dụ của tôi là 3.0) và cùng với nâng cấp lên OmniAuth 1.1.0, Tất cả đã được khắc phục! Bạn nhận được tiền thưởng - cảm ơn vì đã chỉ cho tôi đúng hướng. –

+0

có vẻ như tôi đã trễ một chút vì tiền thưởng nhưng tôi rất vui vì tôi có thể giúp :) – Schmurfy

0

Rất có thể bạn cần phải định cấu hình URL gọi lại ứng dụng google của mình để thêm https thay vì http.

Tôi có nhiều thiết lập ứng dụng để thử nghiệm với rails s và triển khai dàn dựng khác và một ứng dụng khác khi triển khai sản xuất.

+0

Thử chạy máy chủ - https://github.com/jjulian/open_id_ssl Google thậm chí không bao giờ được gọi lại ứng dụng của tôi, nó xây dựng một url ban đầu không hợp lệ. –

Các vấn đề liên quan