Omniauth: как установить детали провайдера аутентификации во время выполнения - PullRequest
4 голосов
/ 15 февраля 2011

У меня есть приложение rails, которое доступно с 2 доменов. Facebook требует, чтобы я зарегистрировал приложение facebook для каждого из этих доменов, и дает мне учетные данные для каждого из них. С Omniauth я могу указать только один набор учетных данных, который устанавливается при запуске приложения. Однако мне нужно будет предоставить FB разные учетные данные в зависимости от хоста запроса.

Здесь есть 2 проблемы:

  1. Как изменить учетные данные Omniauth для Facebook во время выполнения?
  2. Как я могу перехватить звонок на Facebook, проверить домен и установить учетные данные соответственно? Фильтр before не будет работать, так как Omniauth использует Rack Middleware.

Любые предложения высоко ценятся!

1 Ответ

0 голосов
/ 08 октября 2013

Копирование ответа из комментариев, чтобы удалить этот вопрос из фильтра «Без ответа»:

Я решил это сам сейчас. Проблема заключалась в том, что стратегия ФБ вызывает вернуться к fb во второй раз, чтобы получить токен доступа. В этом втором звонке были использованы неправильные учетные данные (те, которые установлены в инициализаторе). Так Мне пришлось пропатчить стратегию OAuth2, чтобы она rails app снова, чтобы установить учетные данные времени выполнения для этого второго вызова. При обратном звонке, который обычно обрабатывает только форму ответа Omniauth, я устанавливаю учетные данные и возвращаю 404, если request.env ["omniauth.auth"] присутствует. Это прекрасно работает, но есть некоторые побочные эффекты для приложений без динамических провайдеров.

Проблема в том, что даже если приложение не хочет устанавливать учетные данные во время выполнения, оно должно добавить условие к обратному вызову, например if request.env ["omniauth.auth"], чтобы избежать кода обратного вызова выполняется, когда он вызывается в первый раз. Решение, вероятно, состоит в том, чтобы добавить параметр в конструктор Omniauth, такой как: dynamic_provider, и вызывать приложение только в том случае, если он установлен.

~ ответ за Нико

...