【问题标题】:Devise, OmniAuth & Facebook: "Not found. Authentication passthru."设计、OmniAuth 和 Facebook:“未找到。身份验证通道。”
【发布时间】:2012-12-11 02:45:26
【问题描述】:

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

我的 config/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。

【问题讨论】:

  • 您的users/omniauth_callbacks 控制器是否继承自Devise::OmniauthCallbacksController
  • 确实...我最终删除了大部分建议的内容并使其正常工作;需要回答我自己的问题!
  • 您应该为其他读者提供您的解决方案。
  • 我通过这种方式解决了 LinkedIn 发生的类似问题:stackoverflow.com/questions/27248166/…
  • 我有同样的问题,我要疯了!!!我试图找出问题,但我不知道为什么它不起作用。它适用于一个新的 Rails 应用程序,但对于我正在尝试实现它的现有应用程序,它不起作用!!!

标签: ruby-on-rails devise omniauth


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      所以我在打开一个旧项目后偶然发现了这一点,在看到我的授权 url 看起来像“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
      

      希望这篇文章对某人有所帮助。

      【讨论】:

      • 对我来说,两条路线都会导致“未找到。身份验证通路。”页面
      • 当您运行 rake 路由时,facebook omniauth 路径如何寻找您?
      【解决方案4】:

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

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

      【讨论】:

      • 是的! As of v2.0.0, OmniAuth by default allows only POST to its own routes.这就是我一直在等待的答案!这很有帮助,现在它就像一个魅力
      • 我正在做所有这些并使用&lt;%= button_to "Sign in with Pocket", auth_user_pocket_omniauth_authorize_path, method: :post, data: { turbolinks: false } %&gt;,但在 Rails 7 上仍然出现此错误。您知道可能导致它的原因吗?
      • 我不使用 Turbolinks 也不使用 Rails 7,所以为了帮助您,我需要更多信息。错误是什么?
      【解决方案5】:

      我应该早点列出这个,但我最终采取了“退出并重试”的方法;我删除了与 OmniAuth 相关的所有内容,并按照说明重新开始。我希望我知道我做错了什么,具体来说,但不幸的是,一旦我重试,它就“正常工作”了。

      tl;dr 逐字按照https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview 中的步骤操作,它应该可以工作

      【讨论】:

        【解决方案6】:

        对于任何想知道如何解决这个问题的人,只需声明一个passthru 方法,或者做我所做的,即使用action_missing(不是method_missing,它在Rails 4 中已弃用!)来捕获所有 users/auth/:provider url,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
        

        我希望这可以帮助其他陷入困境的人,我确实做到了。

        【讨论】:

          【解决方案7】:

          我今天花了一整天的时间试图追查这个问题,我终于在回顾 git 历史的时候找到了它,因为它曾经工作得更早。

          事实证明,以某种方式切换语言环境的路由过滤器是万恶之源。我刚刚在我的路由中禁用了filter :locale 方法,并且授权请求通过了facebook。该死的,我很高兴我终于发现了这一点:)

          【讨论】:

            【解决方案8】:

            看到Not found. Authentication passthru. 意味着 Omniauth 控制器没有捕捉到路由。这很可能是因为路由是通过 GET 到达的,但最近默认只支持 POST。

            对于Google Oauth2 integeration 的建议是简单的重新启用 GET 请求:

            OmniAuth.config.allowed_request_methods = [:get]
            

            【讨论】:

              【解决方案9】:

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

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

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

              【讨论】:

                【解决方案10】:

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

                对于用户类:

                config.omniauth_path_prefix = "/users/auth"
                

                对于其他类(例如,当您使用帐户而不是用户时):

                config.omniauth_path_prefix = "/accounts/auth"
                

                翻译路线也是如此(我的情况)。我已经将“用户”翻译成“blabla”。为了让它工作,我必须将前缀设置为“/blabla/auth”。 (仅适用于一种语言环境!)

                【讨论】:

                  【解决方案11】:

                  确保在 user.rb 和 devise.rb 上使用相同的 provider 拼写 -

                  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"
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-01-30
                    • 2017-05-10
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-10-22
                    • 2021-09-21
                    相关资源
                    最近更新 更多