尝试跟随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.
答案 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
时,可能会发生这种情况。
button_to
。link_to
,您可以将 method: :post
与 rails-ujs
一起使用,但我建议您使用该表单,因为它上面有 CSRF;答案 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