Вы знаете, я думаю, что, возможно, я попытаюсь решить этот трудный путь.
Куки могут быть ответом. Я думаю, вы можете решить эту проблему, указав, что ваш файл входа в систему хранит куки-файл, а затем перенаправляется на правильный путь для проверки подлинности , и когда срабатывает обратный вызов (в SessionsController#create
), вы просто читаете файл cookie, чтобы узнать, где его перенаправить ,
Итак, прямо сейчас ваша ссылка «login with 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. Существует опция конфигурации, чтобы переопределить обратный вызов по умолчанию, но, как представляется, его легко установить динамически.
Итак, мне стало ясно, что файлы cookie будут проще, специфичны для пользователя, и поскольку вам теоретически нужно хранить эту информацию from
в течение очень короткого времени (между тем, когда пользователь пытается аутентифицироваться, и когда обратный вызов запускается), нет ничего сложного в создании файла cookie, а затем удалите его, когда будет вызван обратный вызов.
http://stackoverflow.com/questions/7999907/passing-random-url-params-to-omniauth – Zabba
Ваш «от» параметр может быть получен через окр [» omniauth.params "] –
@David Оцените свой комментарий. Спасибо, я подтвердил, что ваш подход работал после обратного вызова! – GeorgeW