Omniauth - Происхождение равно нулю

Я использую драгоценный камень с твиттером. При обратном вызове проверьте, существует ли пользователь, и создайте его или отправьте обратно на главную страницу.
Возможно, я делаю что-то не так, но в моем коде обратного вызова request.env['omniauth.origin'] равен нулю.

Мой код довольно прост:
whatever.html.erb

<%= link_to image_tag("twitter-connect.png"), "/auth/twitter" %>

routes.rb

match "/auth/:provider/callback" => "sessions#create"

sessions_controller.rb

def create
    auth = request.env["omniauth.auth"]
    user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) || User.create_with_omniauth(auth)
    if !user.email
        redirect_to confirm_path, :notice => "Add your email!"
    else
        redirect_to request.env['omniauth.origin'] || root_url, :notice => "Signed in!"
    end
end

Если я вызову request.env['omniauth.origin'] сразу после обратного вызова, я получу объект nil.

Спасибо за вашу помощь!


person Laurent    schedule 26.04.2011    source источник
comment
Какую версию omniauth вы используете?   -  person Aditya Sanghi    schedule 26.04.2011
comment
Я спрашиваю, потому что я думаю, что в более новых версиях omniauth есть проблемы, связанные с этим.   -  person Aditya Sanghi    schedule 26.04.2011
comment
Привет Адитья. Я только что обновился сегодня утром на 0.2.4, так что последний выпуск.   -  person Laurent    schedule 26.04.2011
comment
У меня такая же проблема с 0.2.3 и 0.2.4. При неудачном обратном вызове я не получаю omniauth.origin. Я также пытался добавить ?origin=/foo к моей ссылке /auth/google, но безуспешно.   -  person sickill    schedule 28.04.2011


Ответы (2)


Попробуйте версию 0.2.0 — мне удалось заставить эту версию без проблем работать с Rails 3.0.9 и Ruby 1.9.2-p180.

  1. Разве ваша строка выше не должна читаться как

    user = auth.find_by_provider_and_uid(auth["поставщик"], auth["uid"]) || User.create_with_omniauth(авторизация)

  2. Что касается omniauth.origin как nil, см. это обсуждение.

person Michael De Silva    schedule 22.06.2011
comment
Привет, Майк, спасибо за направление. Что касается 1), не уверен => я пытаюсь найти пользователя с информацией в auth и создаю его, если не нахожу. - person Laurent; 23.06.2011
comment
Ну, я хочу сказать, что вы не можете сделать User.find_by_provider_and_uid, поскольку модель пользователя не имеет полей провайдера/uid; последнее, что я проверил, динамический поиск find_by_* позволяет указывать атрибуты только этой конкретной модели. С другой стороны, вы можете проверить, есть ли у текущей аутентификации связанный пользователь, то есть if current_user == auth.user. Ознакомьтесь с логикой, которую я использовал здесь; Я решил сделать if current_user && authentication. - person Michael De Silva; 23.06.2011

Вам нужно вручную установить источник в ссылке в вашем представлении. В Rails 4 request.original_url — лучший способ сделать это.

В вашей кнопке link_to Twitter вы можете установить источник вручную:

"/auth/twitter?origin=#{request.original_url}"

Затем в вашем SessionsController, когда вы перенаправляете на request.env['omniauth.origin'], он должен работать правильно.

person spitz    schedule 14.05.2014