首页 > 解决方案 > 是否可以在没有任何重定向的情况下进行 Devise 登录、注销等操作?

问题描述

我正在使用 Devise,但没有直接使用 Devise 控制器,因为我正在通过自定义构建的 GraphQL API 执行所有操作。例如,我遇到的一个问题是,在启用 之后confirmable,如果用户尝试登录并且我调用Devise::Controllers::Helpers#sign_in该用户会被重定向到/api/v1/users/sign_in,这不存在,即使存在也是错误的。相反,我需要将登录失败返回到我的代码(返回值、异常等),以便我的 API 可以将该响应编码到前端。

我怎样才能做到这一点?

例如,这是我的登录功能:

def resolve(email:, password:)
  user = User.find_for_authentication(email: email)
  if user&.valid_password?(password)
    context[:sign_in].call(user)
    { current_user: user }
  else
    { errors: [{ message: 'Email or password incorrect.' }] }
  end
end

context[:sign_in]Devise::Controllers::Helpers通过包含然后简单地在 GraphqlController 中设置:

context = {
  current_user: current_user,
  sign_in: method(:sign_in),
  sign_out: method(:sign_out)
}

注意:我没有使用GraphqlDevise因为我不想使用Devise Token Auth,我正在使用 cookie。

标签: ruby-on-railsdevise

解决方案


我相信通过上下文传递设计的 sign_in/sign_out 方法可能是死路一条。

@Int'l Man Of Coding Mystery 对您的问题的评论中的建议很好,即您可以使用:https ://github.com/graphql-devise/graphql_devise 。

如果您不热衷于引入另一个依赖项并弄清楚如何连接所有内容,您可能会使用覆盖设计的 SessionController。请参阅此处的一些示例:Rails - 如何在用户登录时覆盖设计 SessionsController 以执行特定任务? (但也不要犹豫查看匹配的 Devise 版本的源代码:https ://github.com/heartcombo/devise/blob/master/app/controllers/devise/sessions_controller.rb )

根据您的用例,您甚至可以通过使用一些配置选项来做您需要的事情 - 例如,您也许可以尝试覆盖after_sign_in_path等。


推荐阅读