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

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

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

Ответы [ 3 ]

1 голос
/ 16 сентября 2013

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

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

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

0 голосов
/ 10 февраля 2016

Я проделал аналогичную работу с устройством omniuthable. Вы можете передать любой параметр по ссылке. как

<%= 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']

0 голосов
/ 11 апреля 2011

Ради потомков, я решил это следующим образом:

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

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

...