今天想给应用快速撸一个用户系统,注册登录,没想到搞了半天。上了 devise, 发现 current_user 在 sign_in 之后还是 nil
. sign_in 本身是正常的,但是这个 current_user 只能 per request 有效。
原因:session-based authentication 在 API mode Rails application 中无法使用
解决思路:
devise-jwt
(https://github.com/waiting-for-dev/devise-jwt) 或 http authenticationconfig.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 都行。
扫描二维码添加微信