设计,OmniAuth& Facebook:“没找到。身份验证passthru。”

时间:2012-12-11 02:45:27

标签: ruby-on-rails devise omniauth

尝试跟随https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview,我很难过。

我的routes / initializers / devise.rb中有config.omniauth :facebook, ENV['FB_APP_ID'], ENV['FB_APP_SECRET'],我的routes.rb中有devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks" },并且定义了OmniAuthCallbacks控制器。

当我访问user_omniauth_authorize_path(:facebook)时,我得到: Not found. Authentication passthru.我不确定接下来该做什么。我没有使用路由全球,因此我不认为我需要定义一个passthru方法,但这样做只会给我一个404.

10 个答案:

答案 0 :(得分:10)

还要确保已添加到OmniauthCallbacksController的路由:

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

并且已将更新添加到用户模型中的设计声明:

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

答案 1 :(得分:7)

所以我在打开一个旧项目之后对此进行了标记,并在看到我的授权网址之后发布了类似" user / auth / facebook.facebook"我跑了一个rake路线并通过改变来解决它

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

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

显然,自从rake routes命令返回后,omniauth路由的帮助程序发生了变化:

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

希望这篇文章可以帮助别人。

答案 2 :(得分:6)

我有同样的错误。
对我有用的是重新启动rails服务器,以反映我对config / initializers / devise.rb所做的更改(config.omniauth :facebook, ENV['FB_APP_ID'], ENV['FB_APP_SECRET'])。

答案 3 :(得分:4)

我应该早点列出这个,但最后我做了一个“退出并重试”的方法;我删除了与OmniAuth相关的所有内容,并开始按照说明操作。我希望我知道什么,特别是我错了,但遗憾的是,一旦我重试,它“只是工作”。

tl; dr按照https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview逐字记录的步骤进行操作

答案 4 :(得分:4)

对于想要了解如何解决此问题的任何人,只需声明passthru方法,或执行我所做的操作,使用action_missing(不是method_missing,不推荐使用Rails 4!)捕获omniauth在一种方法中使用的所有users / auth /:提供者URL。

例如,

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

我希望能帮助其他任何被困在这里的人,我确实做到了。

答案 5 :(得分:1)

我今天花了整整一天试图追踪这个问题,我终于在回到git历史的时候发现了它,因为它过去曾经工作过。

事实证明,以某种方式切换语言环境的路由过滤器是邪恶的根源。我刚刚在我的路线中禁用了filter :locale方法,授权请求进入了facebook。血淋淋的地狱,我很高兴我终于发现了这一点:)

答案 6 :(得分:1)

当您尝试使用 link_to 而请求将是 GET 时,可能会发生这种情况。

  1. 您需要将其更改为将在其中创建表单的 button_to
  2. 或者,如果您有 link_to,您可以将 method: :postrails-ujs 一起使用,但我建议您使用该表单,因为它上面有 CSRF;
  3. 您需要添加 gem omniauth-rails_csrf_protection 以避免真实性错误。

答案 7 :(得分:0)

尝试在设计初始化程序( config / initializers / devise.rb )文件中设置omniauth_path_prefix。

对于用户类:

config.omniauth_path_prefix = "/users/auth"

对于其他课程(例如,当您使用Account而非用户时):

config.omniauth_path_prefix = "/accounts/auth"

翻译路线(我的情况)也是如此。我把'用户'翻译成'blabla'。为了让它工作,我必须将前缀设置为“/ blabla / auth”。 (仅适用于一个区域设置!)

答案 8 :(得分:0)

请确保在user.rb和devise.rb上都写相同的提供者拼写-

user.rb

devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :confirmable, :omniauthable, omniauth_providers: [:google_oauth2, :facebook], authentication_keys: [:login], reset_password_keys: [:login], confirmation_keys: [:login]

devise.rb

config.omniauth :google_oauth2, ENV["GOOGLE_OAUTH_CLIENT_ID"], ENV["GOOGLE_CLIENT_SECRET"],   
{
    scope: 'userinfo.email, userinfo.profile',
    prompt: 'select_account',
    image_aspect_ratio: 'square',
    image_size: 50
  }

config.omniauth :facebook, ENV['FACEBOOK_APP_ID'], ENV['FACEBOOK_APP_SECRET'], scope: 'email', info_fields: 'email, first_name, last_name', callback_url: "#{ENV["HOST_URL"]}/users/auth/facebook/callback"

答案 9 :(得分:0)

这可能是因为在config/initializers/devise.rb中仅进行了Devise和Omniauth的配置。不要创建onfig/initializers/omniauth.rb文件。

请记住config.omniauth将omniauth提供程序中间件添加到 你的申请。这意味着您不应该添加此提供程序 中间件再次出现在config / initializers / omniauth.rb中,因为它们会发生冲突 相互之间并导致始终失败的身份验证。

https://github.com/heartcombo/devise/wiki/OmniAuth%3A-Overview#before-you-start