Troubleshooting: Resolving Devise Issue in an API-only Application
created_at: 2023-09-18  

今天想给应用快速撸一个用户系统,注册登录,没想到搞了半天。上了 devise, 发现 current_user 在 sign_in 之后还是 nil. sign_in 本身是正常的,但是这个 current_user 只能 per request 有效。

原因:session-based authentication 在 API mode Rails application 中无法使用

解决思路:

config.middleware.use ActionDispatch::Cookies
config.middleware.use ActionDispatch::Session::CookieStore

 

方法1 需要重新写代码,成本相对高,放弃

方法3 尝试了引入之后还是不行,以为是方向错了,实际可用以下方法检查:

rake middleware

还可在浏览器查看 cookie, 正常 sign_in, sign_out 之后应该会有 cookie change, 如果没有,那说明 application cookie set 有问题

方法2 尝试了之后发现还是不行,才明白不是 API-only 的问题,看浏览器里面 cookie 根本没有正常 set

后来发现是只解决了一半,还有一个跨域的问题,因为这次我这个应用是彻底前后端分离,不在一个端口,所以需要使用 credentials (https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials) 在前端请求的时候 来处理这种 cross-origin requests. 不然 cookie 在发送请求的时候就不会发过去

 

当然了,rack-cors 也要配置一下,允许 credentials:

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins "127.0.0.1:3000"

    resource "*",
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head],
      credentials: true  // Add this line
  end
end

 

另外今天还被自己坑了一把,之前没用 devise 的时候,自己为了测试方便写了如下代码:

def current_user
  @user = User.first
end

我说怎么 sign out 了,current_user 还一直在,登出就是登不出去,devise 请求 检查半天... 被自己坑惨

 

哦对了还有个问题,我项目里前端请求用的是 rails/request.js (https://github.com/rails/request.js) 这个库,还不支持请求的时候带 credentials option,我看已经有人 MR 了但是还没有 release, 先用着 axios 或者 fetch 都行。

0 赞  
back
no comment yet
回复成功

回复成功

请输入内容