Rails 应用程序中的 DeviseTokenAuth

DeviseTokenAuth in Rails Application

我正在我的 Rails 应用程序中实现一个会话,我正在使用 DeviseTokenAuth gem。 我想实现一个场景,如果用户在 15 分钟内没有从前端发送请求,那么会话应该过期;会话有效期为 15 分钟。但是,如果用户连续发送请求,则应将会话时间延长 15 分钟。我正在分享我的 DeviseTokenAuth 配置代码。

DeviseTokenAuth.setup do |config|

  config.change_headers_on_each_request = true
  config.token_lifespan = 15.minutes
  config.token_cost = Rails.env.test? ? 4 : 10
  config.batch_request_buffer_throttle =  30.seconds
end 

如果我做错了什么,请告诉我

好的,所以您已将 token_lifespan 设置为 15 分钟(DeviseTokenAuth 将其理解为“自上次登录以来的 15 分钟”),但您实际上希望它是 last_accessed_at + 15.minutes。这并不是 DeviseTokenAuth 真正设计的目的,因此您需要为此编写自己的处理程序。

您可能需要一个每次收到请求时运行的 before_action,它检查自上次请求以来已经过了多长时间,如果超过 15 分钟则使令牌无效。并且您将需要一个匹配的 after_action 过滤器,用于存储用户上次访问数据库中的应用程序的时间(在类似于 last_accessed_at 的字段中,类似于自动 created_at 字段)。

您可以创建一个单独的列,last_accessed_at 应该是用户 table 中的 DateTime 字段。

然后,在 app/controllers/application_controller.rb

中添加以下代码片段
before_action :authenticate_user!, :validate_last_accessed


def validate_last_accessed
  if (current_user.last_accessed_at + 14.minutes) < DateTime.now
    current_user.tokens = {}
    current_user.save
    render json: {success: false, message: "your message in here"}
  else
    current_user.update(last_accessed_at: DateTime.now)
  end
end

无需将令牌过期时间设置为 15 分钟,您甚至可以将其设置为任意数量的 days/weeks。如果用户未在给定时间范围内(在本例中为 15 分钟)访问应用程序,则令牌将被清除。

专业提示:为了使用此功能,对于每个请求,您都必须访问数据库以更新记录。我建议您使用 redis 等缓存数据库来 store/update 用户上次访问时间。

另一种解决方案:您可以在每个控制器响应中发送 current datetime,让前端负责时间范围。