项目用的是laravel。认证方式是jwt认证,我想token只能使用一次但是不知道怎么做?求大神提供思路.
2 回答
![?](http://img1.sycdn.imooc.com/533e4c3300019caf02000200-100-100.jpg)
呼如林
TA贡献1798条经验 获得超3个赞
刚才研究了一下源码得到如下答案
最简单的办法就是使用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进行验证。
![?](http://img1.sycdn.imooc.com/54584dad0001dd7802200220-100-100.jpg)
忽然笑
TA贡献1806条经验 获得超5个赞
JWT 认证应该带上时间戳(或者其他可以表明请求独立性的东西),每次发送请求的时候都计算一次 token,后端会拿到包含时间戳的参数列表和 token,然后根据它们也计算一个 token,如果两边一致,则 token 验证通过。
因此 token 本身就是要每次都重新计算一次的,你在前端存储 token 是没有太大价值的,当然可以用于记录日志,但这并没有太多意义。
- 2 回答
- 0 关注
- 2619 浏览
添加回答
举报
0/150
提交
取消