URL-адрес динамического обратного вызова OmniAuth для аутентификации определенных объектов вместо current_user

Скажем, у меня есть модели User и Project. Пользователи и проекты связаны с HABTM. Моя установка на самом деле немного сложнее, но я думаю, что для целей моего вопроса это подойдет.

Теперь я хочу использовать omniauth для аутентификации конкретного проекта в Twitter, Facebook и т. д. Я понял, как определить мой omniauth path_prefix, но я не знаю, как я мог бы передать такую ​​​​переменную: config.path_prefix = 'projects/:project_id/auth', не говоря уже о том, чтобы создать собственный URL-адрес обратного вызова, такой как project/:project_id/auth/twitter/callback.


person Zac    schedule 03.04.2011    source источник


Ответы (3)


Это сломает производство. В разработке вы можете обойтись без переменной сеанса. Но в производстве вам нужно, чтобы URL-адрес обратного вызова содержал ваш project_id, поскольку это может быть 2 или более регистров с разными auth_project_id, и тогда у вас нет возможности узнать, какой из них вызывается впоследствии (обратный вызов является асинхронным).

https://github.com/mkdynamic/omniauth-facebook#custom-callback-urlpath

что-то вроде config.path_prefix = "projects/#{@project.id}/auth" может работать. Я сейчас тестирую похожую ситуацию.

person Walter Schreppers    schedule 16.09.2013

Ради потомков я решил это так:

Я добавил метод auth в свой контроллер проектов, который устанавливает переменную сеанса session[:auth_project_id], а затем перенаправляет на auth/ + params[:provider].

В моем контроллере обратного вызова authentications я получил свой проект с помощью @project = Project.find(session[:auth_project_id]), создал аутентификацию, а затем session[:auth_project_id] = nil, чтобы сбросить переменную сеанса.

person Zac    schedule 11.04.2011

Я сделал то же самое с devise omniauthable. Вы можете передать любой параметр по ссылке. подобно

<%= link_to "Add twitter Account",  user_omniauth_authorize_path(:twitter, params:  { project_id: @project.id     }) %>

Затем в вашем контроллере обратного вызова

before_action :set_project, only: [:twitter]

def set_project
  @project = Project.find(request.env['omniauth.params']['project_id'])
end

Примечание. НЕ используйте request.env['omniauth.auth']

person GS Shahid    schedule 10.02.2016