JWT-Auth 黑名单功能 
                                                    
                        
                    
                    
  
                    
                    JWT
如果你使用过 JWT 那么一定会用到 jwt-auth 这个库,其中的黑名单功能你可能并不一定了解。
黑名单
文档中其实提到了 invalidate 方法是用来将 Token 加入黑名单,哪里在用这个功能呢?其实刷新 Token 就是将旧 Token 放入黑名单,然后生成一个新的 Token,看一下代码:
tymon/jwt-auth/src/Manager.php
.
.
.
    public function refresh(Token $token, $forceForever = false, $resetClaims = false)
    {
        $this->setRefreshFlow();
        $claims = $this->buildRefreshClaims($this->decode($token));
        if ($this->blacklistEnabled) {
            // Invalidate old token
            $this->invalidate($token, $forceForever);
        }
        // Return the new token
        return $this->encode(
            $this->payloadFactory->customClaims($claims)->make($resetClaims)
        );
    }
.
.
.可以看到如果我们开启了黑名单 $this->blacklistEnabled 那么就会调用 invalidate 方法将旧 Token 加入黑名单。 invalidate 方法依次经过了:
- Tymon\JWTAuth\Blacklist的- add方法;
- Tymon\JWTAuth\Providers\Storage\Illuminate的- add方法;
- 最终调用 Laravel 当前的 Cache,将 Token 加入缓存。
有兴趣的同学可以研究一下代码是如何执行的,其实黑名单其实就是将 Token 放入缓存,这样验证这个 Token 的时候,就会去黑名单(缓存)中看看,如果黑名单中有,则验证失败。
同样的,登出(logout)方法也是将 Token 加入黑名单。
tymon/jwt-auth/src/JWTGuard.php
.
.
.
    /**
     * Logout the user, thus invalidating the token.
     *
     * @param  bool  $forceForever
     *
     * @return void
     */
    public function logout($forceForever = false)
    {
        $this->requireToken()->invalidate($forceForever);
        $this->user = null;
        $this->jwt->unsetToken();
    }
.
.
.使用黑名单
你可能会遇到这种需求:
同一时间只允许登录唯一一台设备。例如设备 A 中用户如果已经登录,那么使用设备 B 登录同一账户,设备 A 就无法继续使用了。
通俗一点解释,假设你有两个手机,一个苹果,一个小米,苹果手机已经登录了你的微信,那么这时使用小米手机登录后,苹果手机中的微信就应该自动退出了。
那么对于接口来说,怎么实现上面这个需求呢?其实我们根本不需要关心具体是哪个设备在登录,我们只需要保证同一个用户,只有最后一次调用接口获取的 JWT 是有效的就行。
我们可以给用户表新增一个字段,或者单独使用一张表,总之是需要先将用户的 Token 存下来,那么下次用户再次登录时,调用如下代码将旧 Token 加入黑名单:
\JWTAuth::setToken($oldToken)->invalidate();然后将新的 Token 保存下来,最后将 Token 返回。
本作品采用《CC 协议》,转载必须注明作者和本文链接
 
           liyu001989 的个人博客
 liyu001989 的个人博客
         
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
                     
                     
             
             
             
            
 
             
             
             
             
            
 
             
             
             
            

 
             
         
             
             
           
           关于 LearnKu
                关于 LearnKu
               
                     
                     
                     粤公网安备 44030502004330号
 粤公网安备 44030502004330号 
 
推荐文章: