JWT认证怎么使token只能使用一次

项目用的是laravel。认证方式是jwt认证,我想token只能使用一次但是不知道怎么做?求大神提供思路.

幕布斯6054654
浏览 2620回答 2
2回答

呼如林

刚才研究了一下源码得到如下答案最简单的办法就是使用jwt自带的jwt.refresh路由中间件(在这之前应该使用jwt.auth验证了token的合法性).源代码如下 public function handle($request, \Closure $next) { $response = $next($request); try { $newToken = $this->auth->setRequest($request)->parseToken()->refresh(); } catch (TokenExpiredException $e) { return $this->respond('tymon.jwt.expired', 'token_expired', $e->getStatusCode(), [$e]); } catch (JWTException $e) { return $this->respond('tymon.jwt.invalid', 'token_invalid', $e->getStatusCode(), [$e]); } // send the refreshed token back to the client $response->headers->set('Authorization', 'Bearer '.$newToken); return $response; } 步骤为:parseToken()把前端传过来的在http header中的token解析出来refresh()函数负责依据现在的token生成一个新的token并把现在的token放到黑名单最后将newToken写到返回给客户端的header中 最后我在研究源码的时候还发现如果我们需要每个请求都要刷新token的话那么就用jwt.refresh这一个中间件就好,不再需要jwt.auth这个中间件了。因为产生新的token的时候会解析出原来token中的payload的信息,比如sub。因此也会对原始的token进行验证。

忽然笑

JWT 认证应该带上时间戳(或者其他可以表明请求独立性的东西),每次发送请求的时候都计算一次 token,后端会拿到包含时间戳的参数列表和 token,然后根据它们也计算一个 token,如果两边一致,则 token 验证通过。 因此 token 本身就是要每次都重新计算一次的,你在前端存储 token 是没有太大价值的,当然可以用于记录日志,但这并没有太多意义。
打开App,查看更多内容
随时随地看视频慕课网APP