我正在构建一个Rails应用程序,其中有Omniauth个用于登录服务.为了验证谷歌,我使用的是OmniAuth Google OAuth2 Strategy.

当用户点击"允许访问"按钮时,一切正常.但当用户点击"不感谢"按钮时,会出现以下错误.

OmniAuth::Strategies::OAuth2::CallbackError

我已try 在应用程序控制器中添加以下救援代码.

class ApplicationController < ActionController::Base
  rescue_from OmniAuth::Strategies::OAuth2::CallbackError, :with =>
    :omniauth_callback_error_handler

 protected

 def omniauth_callback_error_handler
  redirect_to init_sign_in_users_path
 end
end

但运气不好.知道吗?

推荐答案

发生这种情况是因为身份验证发生在中间件中,因此您的控制器不参与其中.这是where the exception is raised,调用的代码是this

我认为您可以通过在OmniAuth初始值设定项中使用此类代码定义回调来处理此类错误

OmniAuth.config do |config|
  config.on_failure do
    # your handling code invoked in the context of a rack app
  end
end

否则,三个月前就有a commit家引入了这种行为

def redirect_to_failure
  message_key = env['omniauth.error.type']
  new_path = "#{env['SCRIPT_NAME']}#{OmniAuth.config.path_prefix}/failure?message=#{message_key}"
  Rack::Response.new(["302 Moved"], 302, 'Location' => new_path).finish
end

它表示,如果出现错误,用户将被重定向到/auth/failure,并显示一条错误消息,因此您应该能够为该路径定义一条路由,并在应用程序中进行处理.请记住,这种情况不会发生,所以你需要在其他环境中try .如果在生产中没有出现这种情况,请try 将omniauth gem升级到1.1.0版

Ruby-on-rails相关问答推荐

通过激励控制器正确更新Turbo帧信源

Rails TurboStream:可以向元素动态添加一个css类吗?

使用FactoryBot测试ActiveStorage的RSpec请求规范

Rails 使用多个外键创建/构建

如何在测试期间为 Rails 应用程序启用 Rails.cache 会话对象

在 Rails 7 中,可以将导入映射与 js Bundle 解决方案一起使用,还是它们是专有的?

在 Ruby on Rails html.erb 文件中循环

rails 3.2 迁移无法在更改方法中向 create_table 添加索引

rails 3 - link_to 销毁不工作

Ruby on Rails 中的消息队列

Ruby 元素是否存在于数组中

将 Amazon SES 与 Rails ActionMailer 结合使用

从 before_action 中排除控制器

Ruby on Rails:有条件地显示部分

如何在rails中异步加载部分页面

Ruby on Rails:调试 rake 任务

Rails - 具有空数组的强参数

如何在 RSpec 中包含 Rails 助手

ArgumentError:ApplicationController 的副本已从模块树中删除,但仍处于活动状态

没有路由匹配缺少必需的键:[:id]