16

试图跟随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" }在我的 routes.rb 中,并定义了一个 OmniAuthCallbacks 控制器。

当我访问时user_omniauth_authorize_path(:facebook),我得到: Not found. Authentication passthru.我不知道下一步该做什么。我没有使用路由全局,所以我不相信我需要定义一个 passthru 方法,但这样做只会给我一个 404。

4

11 回答 11

10

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

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

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

devise :omniauthable, :omniauth_providers => [:facebook]
于 2014-03-07T09:41:27.220 回答
8

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

于 2014-03-28T12:19:35.653 回答
8

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

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

于 2016-07-18T02:56:05.517 回答
6

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

  1. 您需要将其更改为button_to将创建表单的位置。
  2. 或者,如果您有,则可以使用link_towith ,但我建议您使用该表单,因为它上面会有 CSRF;method: :postrails-ujs
  3. 您需要添加 gem omniauth-rails_csrf_protection以避免真实性错误。
于 2021-07-12T15:05:24.997 回答
5

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

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

于 2013-03-21T13:38:47.087 回答
4

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

例如,

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

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

于 2013-05-16T14:50:54.700 回答
3

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

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

于 2015-09-05T16:03:23.500 回答
2

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

天真的答案以及对Google Oauth2 整数的建议是简单地重新启用 GET 请求:

OmniAuth.config.allowed_request_methods = [:get]
于 2021-11-16T02:50:22.640 回答
1

这可能会发生,因为使用 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

于 2020-10-09T16:58:46.650 回答
0

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

对于用户类:

config.omniauth_path_prefix = "/users/auth"

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

config.omniauth_path_prefix = "/accounts/auth"

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

于 2014-04-30T08:46:25.947 回答
-1

确保在 user.rb 和 devise.rb 上编写相同的提供者拼写,例如 -

用户.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]

设计.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"
于 2020-07-03T11:28:08.330 回答