刷新令牌,真正短暂的访问令牌和服务器负载

时间:2016-10-26 17:54:55

标签: jwt refresh-token

我一直在研究如何为我们正在构建的基于PHP的API实现JWT,目前最令我困惑的一件事是刷新令牌。根据我收集的内容,您在初始身份验证期间同时获得访问令牌和刷新令牌,并且刷新令牌将允许您基本跳过此初始身份验证步骤,以在需要时为您提供全新的访问令牌。如果我理解正确的话,生成时刷新令牌需要存储在与刚验证自身的客户端配对的数据库中。如果我的访问令牌只能存在极短的时间(例如1分钟),这是否意味着使用API​​的非常繁忙的客户端可能每分钟都会查询我的数据存储以执行刷新步骤(以检查是否刷新令牌存在/仍然有效/尚未撤销/等)?难道不会像每次请求到达我的数据库一样糟糕吗?

2 个答案:

答案 0 :(得分:0)

如果您的访问令牌短时间(1分钟),您将需要每分钟生成一个新的,如果用户停留的时间超过分钟。配置的刷新令牌可以:

  • 首次使用后过期
  • 在给定的时间(f.ex.14天)后过期,因此使用一个刷新令牌你可以生成许多访问令牌
  • 永不过期,只能撤销(f.ex.生成新的刷新令牌

在您的情况下,我认为您可以使用 Memcached 为每个用户存储他自己的刷新令牌。但是,我可以问一下,你的访问令牌必须在1分钟后过期的原因是什么?

例如,首先您可以检查Memcached中是否存在刷新令牌,如果没有将其添加到Memcached并在其后使用它。

示例

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

$user_id = 1;    
$refresh_token = $m->get($user_id."_refresh_token")

if (!refresh_token) {
    if ($m->getResultCode() == Memcached::RES_NOTFOUND) {
        $token = 'Some SQL query to get refresh token';
        $m->set($user_id."_refresh_token", $token );
        $refresh_token = $m->get($user_id."_refresh_token");
    } else {
        /* log error */
        /* ...       */
    }
}

答案 1 :(得分:0)

访问令牌就像用户数据库的数据库缓存,到期时间是该缓存条目的TTL。将访问令牌上的到期时间视为根据用户数据库验证用户的频率。如果您的用户数据库负载过高,则只需增加访问令牌的到期时间。

您的刷新令牌也可能是JWT,因此您无需在DB / memcache中查找。通常,当访问令牌过期时,您检查用户帐户是否未锁定,用户未更改密码等。如果一切正常,则发出新的访问令牌。