为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
幕布斯6054654 2019-03-10 19:38:11
项目用的是laravel。认证方式是jwt认证,我想token只能使用一次但是不知道怎么做?求大神提供思路.
查看完整描述

2 回答

?
呼如林

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进行验证。

查看完整回答
反对 回复 2019-03-18
?
忽然笑

TA贡献1806条经验 获得超5个赞

JWT 认证应该带上时间戳(或者其他可以表明请求独立性的东西),每次发送请求的时候都计算一次 token,后端会拿到包含时间戳的参数列表和 token,然后根据它们也计算一个 token,如果两边一致,则 token 验证通过。

因此 token 本身就是要每次都重新计算一次的,你在前端存储 token 是没有太大价值的,当然可以用于记录日志,但这并没有太多意义。

查看完整回答
反对 回复 2019-03-18
  • 2 回答
  • 0 关注
  • 2619 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信