主要参考这篇文章

Rails 本身对 session 做了 Marshal.dump 和 Marshal.load,nodejs 做这部分就比较困难,所以就采用一个变通的方法在用户登录的时候给他的 cookie 里面设一个值,然后再用这个值做为一个 hash 的 key 和用户的信息一起放到 redis 里面,用户登出的时候再把这个值删掉就可以了

# app/controllers/application_controller.rb
def after_sign_in_path_for(resource_or_scope)
  #store session to redis
  if current_user
    # an unique MD5 key
    cookies["_validation_token_key"] = Digest::MD5.hexdigest("#{session[:session_id]}:#{current_user.id}")
    # store session data or any authentication data you want here, generate to JSON data
    stored_session = JSON.generate({"user_id"=> current_user.id, "username"=>current_user.screen_name, ... ...})
    $redis.hset(
      "mySessionStore",
      cookies["_validation_token_key"],
      stored_session,
     )
   end
end
 
def after_sign_out_path_for(resource_or_scope)
  #expire session in redis
  if cookies["_validation_token_key"].present?
    $redis.hdel("mySessionStore", cookies["_validation_token_key"])
  end
end