Передача параметров через OmniAuth - PullRequest
52 голосов
/ 27 марта 2012

Мне нужно передать некоторые параметры для действия обратного вызова. Судя по исходному коду, OmniAuth должен добавить строку запроса к URL обратного вызова, но, как ни странно, это не так. Когда я открываю

/auth/facebook?from=partner

... и вы будете перенаправлены на Facebook, return_url это просто

/auth/facebook/callback

... без параметров.

Ответы [ 7 ]

76 голосов
/ 12 июля 2013

Поработав со всеми вышеприведенными ответами, я выяснил, что делать с Facebook , который по умолчанию не отображает параметры в request.env["omniauth.auth"].

Итак - если вы используете строку запроса для обратного вызова, примерно так:

"/auth/facebook?website_id=#{@website.id}"

Единственный способ получить этот параметр website_id - использовать request.env["omniauth.params"]. ПРИМЕЧАНИЕ: УБЕДИТЕСЬ, ЧТО ВЫ ИСПОЛЬЗУЕТЕ omniauth.params, а не omniauth.auth - это меня на некоторое время сбило с толку .

Затем, чтобы проверить это, вы можете проверить это в действии вашего контроллера (обратите внимание на строку RAISE ...):

def create
  raise request.env["omniauth.params"].to_yaml 
  # the rest of your create action code...
end

Вы должны увидеть там свой параметр.Отлично.Теперь вернитесь к своему контроллеру и удалите эту строку RAISE.Затем вы можете получить доступ к параметру следующим образом в вашем действии контроллера:

params = request.env["omniauth.params"]
website_id = params["website_id"]

ПРИМЕЧАНИЕ: в параметрах ["website_id"] вам нужно использовать кавычки, а НЕ символ.

22 голосов
/ 17 апреля 2012

Я думаю, что файл cookie работает, но зачем все это, когда вы можете использовать переменную состояния, как описано здесь: https://github.com/mkdynamic/omniauth-facebook

Вот как я ее использовал:

при созданииURL Вы можете просто добавить состояние в строке запроса, и оно будет доступно и в URL обратного вызова.

user_omniauth_authorize_path(:facebook, :display => 'page', :state=>'123') %>

теперь URL-адрес обратного вызова будет

http://localhost:3000/users/auth/facebook/callback?state=123&code=ReallyLongCode#_=_

Теперь в обработчике обратного вызова вы можете обработать состояние

12 голосов
/ 14 декабря 2015

Вы можете использовать опции :params, как в

omniauth_authorize_path(:user, :facebook, var: 'value', var2: 'value2' )

и позже в обратном вызове вы можете получить доступ к request.env['omniauth.params'], чтобы получить хеш! :)

(скопировано с этого ответа )

7 голосов
/ 27 марта 2012

То, что вы хотите сделать, это динамически настроить ваш обратный вызов, чтобы включить имя партнера в URL ( не параметры URL), на для каждой транзакции аутентификации в зависимости от того, какойпартнер был вовлечен.Это означает динамическую настройку URL обратного вызова для каждого запроса аутентификации.См. это сообщение в блоге, чтобы начать .URL обратного вызова автоматически удаляет параметры url, как вы заметили, поэтому выполнение этого с параметрами не будет работать.

Таким образом, если вместо попытки передать имя / идентификатор партнера в качестве параметра (которыйвы удалили), вы структурировали свои маршруты таким образом, чтобы partner_id и OmniAuth provider были частью URL-адреса обратного вызова, тогда у вас будет что-то вроде:

/auth/:omniauth_provider/callback/:partner_id

... где допустимый обратный вызовбыло бы что-то вроде

/auth/facebook/callback/123456

... тогда вы бы знали, что данный колбэк поступил с Facebook с идентификатором партнера 123456

6 голосов
/ 11 августа 2012

OmniAuth уже имеет встроенный способ узнать, где находится пользователь, он называется «происхождение», как описано здесь:

https://github.com/intridea/omniauth/wiki/Saving-User-Location

1 голос
/ 04 апреля 2012

Вы знаете, я думаю, что, возможно, я пытаюсь решить это трудным путем.

Куки могут быть ответом. Я думаю, что вы можете решить эту проблему, сохранив cookie-файл в своем действии при входе в систему, а затем перенаправив на правильный путь /auth/:provider для проверки подлинности, а когда сработает обратный вызов (в SessionsController#create), вы просто прочитаете cookie, чтобы узнать, где перенаправить их на.

Итак, прямо сейчас ваша ссылка «войти в систему с Facebook» (или что-то еще, что у вас есть в вашем приложении), вероятно, переходит на /auth/facebook. Вместо этого, если вы создали пользовательское действие, такое как

POST /partner_auth

... и назвал его с помощью URL ...

POST example.com/partner_auth?from=partner&provider=facebook

Тогда у вас может быть контроллер, такой как:

class PartnerAuth < ApplicationController
  def create
    cookies[:from] = params[:from]  # creates a cookie storing the "from" value
    redirect_to "auth/#{params[:provider]"
  end
end

Тогда в действии SessionsController#create у вас будет ...

def create
  ...

  destination = cookies[:from]
  cookies[:from].delete

  redirect_to destination    # or whatever the appropriate thing is for your
                             # app to do with the "from" information
end

Я пытался создать демонстрационное приложение, чтобы выполнить то, что я описал в другом ответе, но вы правы - было слишком сложно пытаться динамически внедрить пользовательский обратный вызов в код OmniAuth. Существует опция конфигурации для переопределения обратного вызова по умолчанию, но, по-видимому, ее нелегко установить динамически.

Итак, до меня дошло, что куки будут намного проще, специфичны для пользователя, и, поскольку вам теоретически нужно хранить эту from информацию только в течение очень короткого времени (между тем, когда пользователь пытается аутентифицироваться, и когда вызывается обратный вызов), нет ничего сложного в создании файла cookie, а затем в его удалении при срабатывании обратного вызова.

0 голосов
/ 16 октября 2012

Используйте переменную 'state'.Facebook позволяет пользователю устанавливать переменную STATE.

Вот как я это сделал, я добавил URL-адрес AUTH с помощью? State = providername

http://localhost/users/auth/facebook?state=providername

Этот параметр возвращается мне при обратном вызовев качестве параметров ['имя поставщика']

Я разработал решение из оригинального метода пути Omniauth

user_omniauth_authorize_path(:facebook, :display => 'page', :state=>'123') %>
...