我正在构建Node.js API服务。我正在发布每5分钟失效一次的JWT访问令牌,一个在一个月内失效的刷新令牌和/ fetch-access路由,以便从SPA /客户端调用时获得新的访问令牌。
现在,我正在使用数据库来存储最近撤销的刷新令牌的列表,管理用户可以通过某些管理操作(例如“暂停帐户”,“更改权限”等)来填充这些刷新令牌。
我的假设是,我将产生相同的JWT令牌字符串值,将其存储在数据库中,并在调用/ fetch-access路由时在数据库中查询该值。但是,我现在意识到的是:在管理用户撤消JWT时,我无法在该时间点复制相同的JWT字符串值。
为了说明我的观点;
const jwt = require('jsonwebtoken') let refresh_token_on_login = jwt.sign({user: 'bob'}, 'secret123', {expiresIn: '7d'}) let refresh_token_on_revoke = jwt.sign({user: 'bob'}, 'secret123', {expiresIn: '7d'}) console.log(refresh_token_on_login) //eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZXN0Ijp0cnVlLCJpYXQiOjE2MDA4Mzg2NzUsImV4cCI6MTYwMTQ0MzQ3NX0.X2zBWVr5t3olb5GsPebHULh-j1-iiuyjJmb98jzlZ2Q console.log(refresh_token_on_revoke) //eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZXN0Ijp0cnVlLCJpYXQiOjE2MDA4Mzg3MTMsImV4cCI6MTYwMTQ0MUxM30.4LDBJv4qrLLzOieDtyXu8vWqJ1EY75vShpUWiX7jepQgg
为了使管理员使先前发出给用户的刷新令牌无效,吊销密钥不能是实际的令牌字符串,而是登录时在数据库中某个位置保存的其他一些值(即UserModel = {last_issued_refresh:'xyz'})。需要在刷新令牌本身中嵌入相同的值,以用于在/ fetch-access请求中检查列入黑名单的令牌。
我的假设正确吗?这是唯一的方法吗,还是我错过了刷新令牌(由客户端用户以外的用户,例如admin)撤消刷新令牌的一些关键点