Вы знаете, я думаю, что, возможно, я пытаюсь решить это трудным путем.
Куки могут быть ответом. Я думаю, что вы можете решить эту проблему, сохранив 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, а затем в его удалении при срабатывании обратного вызова.