Ruby on rails 在访问Omniauth路由之前对设计用户进行身份验证

Ruby on rails 在访问Omniauth路由之前对设计用户进行身份验证,ruby-on-rails,ruby,authentication,devise,omniauth,Ruby On Rails,Ruby,Authentication,Devise,Omniauth,我正在开发一个应用程序,它将designe用于我的用户记录,将omniauth用于用户拥有的记录,而不是将典型的omniauth+designe用于用户记录。我正在尝试将devise的用户身份验证添加到omniauth路由/auth/:provider,以便未注册的访问者无法访问这些路由并触发特定提供商的身份验证过程 我已经能够通过使用Deviate的authenticate\u user向回调添加身份验证helper方法,所以我至少阻止了未注册的访问者从omniauth流中创建记录,但我希望D

我正在开发一个应用程序,它将designe用于我的用户记录,将omniauth用于用户拥有的记录,而不是将典型的omniauth+designe用于用户记录。我正在尝试将devise的用户身份验证添加到omniauth路由
/auth/:provider
,以便未注册的访问者无法访问这些路由并触发特定提供商的身份验证过程

我已经能够通过使用Deviate的
authenticate\u user向回调添加身份验证helper方法,所以我至少阻止了未注册的访问者从omniauth流中创建记录,但我希望Desive的用户身份验证在omniauth流的所有阶段都能工作


关于如何将Deviate的用户身份添加到初始omniauth路由的任何想法,无论是使用类似于我当前解决方案的方法,还是通过使用Deviate的
身份验证:用户是否进行身份验证?

添加Deviate
身份验证用户
或者在omniauth身份验证方法之前使用
before filter
调用它。

这个解决方案对我很有效。它本质上创建了一个新路由,用于检查用户当前是否已登录,然后将其重定向到请求提供程序的授权路径

routes.rb:

scope module: :authentication do
  devise_scope :user do
    # ...
    get 'users/auth/:provider/setup', to: 'omniauth_callbacks#before_request_phase'
  end
  # ...
end
omniauth_callbacks_controller.rb:

def before_request_phase
  authorize_path = send("user_#{params[:provider]}_omniauth_authorize_path".to_s)
  if current_user.present?
    redirect_to(authorize_path)
  else
    redirect_to login_path(return_to: authorize_path)
  end
end

任何人来到这里都会遇到同样的问题:

在请求阶段进行设计验证。如果您正在使用策略gem,例如omniauth facebook,您可以在初始值设定项中对该特定策略进行修补,例如,在
config/initializers/omniauth.rb
中:

模块facebook扩展
包括设计::控制器::助手
def请求\u阶段
#它可能是“admin\u user\u signed\u in”(管理员用户登录),这取决于您的用户模型
如果用户已登录?
超级的
其他的
#一旦设计验证失败,重定向到您认为合适的任何路径
重定向Rails.application.routes.url\u helpers.new\u admin\u user\u session\u路径
结束
结束
结束
OmniAuth::Strategies::Facebook.prepend FacebookExtension

这不起作用。在\u操作之前添加
:要求\u用户
或在\u操作之前添加
:验证\u用户将只需要在OmniAuth回调上进行身份验证,而不需要在启动OAuth时进行身份验证(OmniAuth术语中的“请求阶段”)