OmniAuth использует неверный порт обратного вызова в настройке обратного прокси - PullRequest
5 голосов
/ 24 июля 2011

У меня есть приложение Rails, работающее на порту 3101, и я сделал его доступным для Интернета через настройку обратного прокси-сервера Apache (например, предложенную Phusion для в этом сообщении в блоге .

Я использую Devise + OmniAuth для обработки аутентификации Facebook.

Но когда я пытаюсь пройти аутентификацию через Facebook, меня перенаправляют на URL: http://mydomain.com:3101/my_callback_path

Я начинаюприложение rails с passenger start -a 127.0.0.1 -p 3101 -d и моей настройкой Apache:

<VirtualHost *:80>
    ServerName mydomain.com

    PassengerEnabled off
    ProxyPass / http://127.0.0.1:3101/
    ProxyPassReverse / http://127.0.0.1:3101

    ProxyRequests Off
    ProxyPreserveHost On
    <Proxy *>
      Order deny,allow
      Allow from all
    </Proxy>
</VirtualHost>

Я нашел несколько ответов, таких как this и this , но все они предназначены дляНастройки Nginx.

Я пытался использовать инициализатор с OmniAuth.config.full_host = 'http://my domain.com', но мне интересно, нет ли в моей настройке apache отсутствующей конфигурации (как в предыдущих ответах).

Заранее спасибо.

Ответы [ 2 ]

12 голосов
/ 21 августа 2011

Я заглянул в источник OmniAuth и обнаружил, что механизм обратного вызова внутренне использует метод с именем full_host, который ищет переменную конфигурации и затем строит первую часть URI - взгляните на oa-core-0.2.6/lib/omniauth/strategy.rb

Переменная конфигурации может быть String (как в вашем случае), или Proc, или nil (или что-то еще). В последнем случае URI запроса анализируется, прерывается и возвращается.

Я думаю, что мы не можем решить нашу общую проблему, просто установив переменную окружения в Apache (это, вероятно, следует сделать на более низком уровне, внутри стека приложений ruby), но после некоторых экспериментов я нашел, что это работает достаточно хорошо для меня:

OmniAuth.config.full_host = lambda do |env|
    scheme         = env['rack.url_scheme']
    local_host     = env['HTTP_HOST']
    forwarded_host = env['HTTP_X_FORWARDED_HOST']
    forwarded_host.blank? ? "#{scheme}://#{local_host}" : "#{scheme}://#{forwarded_host}"
end
1 голос
/ 23 июля 2013

У меня была такая же проблема.Это было решено установкой

**proxy_set_header        Host            <proxy-domain-name>;**



  location / {
  proxy_pass  http://127.0.0.1:3000;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_redirect off;
        proxy_buffering off;
        proxy_set_header        Host            <domain name>;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
 }

Что касается проблемы с перенаправлением в facebook, я потратил некоторое время на изучение значения фактического URL-адреса, на который он перенаправлял обратный вызов, поэтому мне пришлось это исправить в nginx conf.Чтобы выяснить это, посмотрите на URL в ссылке и посмотрите значение переменной GET «redirect_uri» вместо того, чтобы сосредоточиться на ошибке, которую она отправила на главной странице.

...