Подтвердить что ты не робот

Devise, OmniAuth & Facebook: "Не найдено. Аутентификация passthru".

Попытка следовать вместе с https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview, и я в тупике.

У меня есть config.omniauth :facebook, ENV['FB_APP_ID'], ENV['FB_APP_SECRET'] в моих config/initializers/devise.rb, devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" } в моих маршрутах .rb и определен контроллер OmniAuthCallbacks.

Когда я навещаю user_omniauth_authorize_path(:facebook), я получаю: Not found. Authentication passthru. Я не уверен, что делать дальше. Я не использую маршрутизацию, поэтому я не считаю, что мне нужно определить метод passthru, но это просто дает мне 404.

4b9b3361

Ответ 1

Также убедитесь, что вы добавили маршрут в OmniauthCallbacksController:

devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" }

и что вы добавили обновление в объявление разработки в своей модели пользователя:

devise :omniauthable, :omniauth_providers => [:facebook]

Ответ 2

Итак, я наткнулся на это после открытия старого проекта, и, увидев, что мой авторизационный url выглядит как "user/auth/facebook.facebook", я запускал маршруты рейка и решил его, изменив

<%= link_to "Sign in with Facebook", user_omniauth_authorize_path(:facebook) %>

к

<%= link_to "Sign in with Facebook", user_facebook_omniauth_authorize_path %>

По-видимому, помощники для маршрутов omniauth изменились с момента возврата команды rake routes:

user_facebook_omniauth_authorize   GET|POST   /users/auth/facebook(.:format)          omniauth_callbacks#passthru

а не так, как это было несколько месяцев назад, когда я начал проект.

user_omniauth_authorize            GET|POST   /users/auth/facebook(:provider)          omniauth_callbacks#passthru

Надеюсь, что этот пост помогает кому-то.

Ответ 3

У меня была такая же ошибка.
Для меня работала перезагрузка сервера rails, чтобы отразить изменения (config.omniauth :facebook, ENV['FB_APP_ID'], ENV['FB_APP_SECRET']), которые я сделал для config/initializers/devise.rb.

Ответ 4

Я должен был перечислить это раньше, но в итоге я сделал подход "отступить и повторить попытку"; Я удалил все, что у меня было связано с OmniAuth, и начал работу над инструкциями. Хотелось бы, чтобы я знал, что конкретно, я ошибался, но, к сожалению, он "просто работал", как только я повторил.

tl; dr Следуйте шагам в https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview дословно и он должен работать

Ответ 5

Для тех, кто хочет знать, как это исправить, просто объявите метод passthru или сделайте то, что я сделал, который использует action_missing (не method_missing, он устарел в Rails 4!), чтобы поймать все пользователи /auth/: провайдер ссылается на то, что omniauth использует один метод.

Например,

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController

  def action_missing(provider)
    # Set up authentication/authorizations here, and distribute tasks
    # that are provider specific to other methods, leaving only tasks
    # that work across all providers in this method. 
  end

Я надеюсь, что это поможет кому-то еще, кто застрял здесь, я это сделал.

Ответ 6

Сегодня я провел весь день, пытаясь отследить проблему, и, наконец, нашел ее, возвращаясь в историю git, так как раньше она работала.

Оказалось, что фильтр маршрутизации для переключения локалей каким-то образом был корнем зла. Я просто отключил метод filter :locale на моих маршрутах и ​​запрос авторизации перешел в facebook. Кровавый ад, я так рад, что, наконец, узнал об этом:)

Ответ 7

Попробуйте установить omniauth_path_prefix в файле инициализатора инициализации (config/initializers/devise.rb).

Для класса пользователя:

config.omniauth_path_prefix = "/users/auth"

Для другого класса (например, если вы используете учетную запись не для пользователя):

config.omniauth_path_prefix = "/accounts/auth"

То же самое с переведенными маршрутами (мой случай). Я перевел "пользователей" на "blabla". Чтобы он работал, мне пришлось установить префикс для "/blabla/auth". (Работает только для одного языка!)