我一直在为我们正在构建的基于 PHP 的 API 实现 JWT 进行一些研究,目前最让我困惑的一件事是刷新令牌。根据我收集的信息,您在初始身份验证期间同时获得了访问令牌和刷新令牌,并且刷新令牌将允许您基本上跳过此初始身份验证步骤,以便在需要时为您获取新的访问令牌。如果我理解正确,生成的刷新令牌需要存储在与刚刚进行身份验证的客户端配对的数据库中。如果我的访问令牌仅存在极短的时间(例如 1 分钟),这是否意味着使用 API 的非常繁忙的客户端可能最终每分钟查询我的数据存储以执行刷新步骤(以检查是否刷新令牌存在/仍然有效/尚未被撤销/等)?不会
问问题
1037 次
2 回答
0
访问令牌就像您的用户数据库的数据库缓存,到期时间是该缓存条目的 TTL。将访问令牌的到期时间视为根据用户数据库验证用户的频率的心跳。如果您的用户数据库负载很高,您只需增加访问令牌的到期时间。
您的刷新令牌也可能是 JWT,因此您无需在 DB/memcache 中查找它。通常,当访问令牌过期时,您会检查用户帐户是否未锁定,用户是否未更改密码等。如果一切正常,您将发出一个新的访问令牌。
于 2016-10-27T09:46:15.867 回答
0
如果您的访问令牌存在时间很短(1 分钟),您将需要每分钟生成一个新令牌,当然如果用户停留时间超过一分钟。刷新令牌取决于配置可以:
- 首次使用后过期
- 在给定时间(例如 14 天)后过期,因此使用一个刷新令牌,您可以生成许多访问令牌
- 永不过期,只能撤销(例如通过生成新的刷新令牌)
在您的情况下,我认为您可以使用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 */
/* ... */
}
}
于 2016-10-27T06:57:36.800 回答