ruby-on-rails - 是否可以在没有任何重定向的情况下进行 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。
解决方案
我相信通过上下文传递设计的 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
等。
推荐阅读
- c# - 如何在相等运算符重载中执行空检查
- regex - 使用单个公式删除所有没有脚本的所有变音符号,以便在所有单元格中使用,而无需调用 Google API
- java - Java - Windows-1252 无效字符
- vb.net - 完全不同的 WinForms 可执行文件认为它们是同一个应用程序
- sql - SQL 查询:如何根据 ID 将 MIN 值从一个表发送到另一个表
- powershell - PSEXEC 在新实例中写入
- python - 输出层基于整数/实数的分类?
- mysql - 寻找连续3年以上从未失业的演员
- javascript - 我的 Discord Music 机器人执行对象而不是文本
- javascript - 试图创建一个平衡值的通用函数(不确定如何用词)