2017-10-20 160 views
0

因此,我开始为我的SPA使用用于Laravel的Tymon JWT包。它的一切都很好(添加用户,登录,获得Auth用户),但是当我提出API请求时,它只能工作一个小时。我知道我在登录时存储的令牌会过期,所以当我在60分钟后向API发出请求时,它不起作用。我的问题是如何刷新令牌并将其恢复到本地存储中?在新的请求?每59分钟?TYmon存储在localstorage中的智威汤逊Laravel Vue刷新令牌

AuthController.php

public function authenticate(Request $request) 
    { 
     // grab credentials from the request 
     $credentials = $request->only('email', 'password'); 

     try { 
      // attempt to verify the credentials and create a token for the user 
      if (! $token = JWTAuth::attempt($credentials)) { 
       return response()->json(['error' => 'Sorry, we cant find you.']); 
      } 
     } catch (JWTException $e) { 
      // something went wrong whilst attempting to encode the token 
      return response()->json(['error' => 'could_not_create_token'], 500); 
     } 

     // all good so return the token 
     $user = JWTAuth::toUser($token); 

     //Fire off the login event 
     event(new LoginSuccessful($user)); 

     return response()->json(compact('token', 'user')); 
    } 

Login.vue

  axios.post('/api/authenticate',{ 
       email: this.email, 
       password: this.password 
      }) 
      .then(response => { 

       if(response.data.error){ 

        //Show the error 
        this.error = response.data.error 
        this.loading = false; 

       } else { 

        this.loading = false; 

        //Store the items in storage 
        localStorage.setItem('jwt_token', response.data.token); 
        localStorage.setItem('user', JSON.stringify(response.data.user)); 

        //Mutate the state 
        this.$store.commit('login'); 

        //Now go to the dashboard 
        this.$router.push('dashboard'); 
       } 

      }) 
      .catch(error => { 

      }); 
在我的脑海标签

<script> 

    window.hopbak = { 
     'jwt_token': localStorage.getItem('jwt_token'), 
     'csrfToken': {!! json_encode(csrf_token()) !!}, 
    }; 

</script> 

在我bootstrap.js

let token = window.hopbak.jwt_token; 

if (token) { 

    window.axios.defaults.headers.common['Authorization'] = 'Bearer ' + token; 

} else { 
    console.log('no token'); 
} 
+1

这是高级别,没有任何代码可以帮助,但是当您收到API令牌时,我会将此以及刷新令牌存储在本地存储中。然后,当您进行API调用时,请添加一个catch来检查错误是否与API标记过期有关,如果确实如此,则使用刷新标记获取新的API标记,然后自动重试原始请求。 – James

回答

0

我认为你需要在app/Http/Kernel.php注册RefreshToken中间件:

protected $routeMiddleware = [ 
    'jwt.refresh' => 'Tymon\JWTAuth\Middleware\RefreshToken' 
]; 

然后将其分配到要刷新令牌的路由。

看看source code,我可以告诉这个中间件会在每个请求中通过向响应头添加一个新的令牌来处理令牌刷新。

+0

每次登录发生时都会收到一个新的令牌,并且该应用程序正常工作,但只需一个小时。所以我需要每60分钟获取一次刷新令牌不仅仅出现在登录页面上 – Packy

+0

还没有尝试过,但查看源代码我认为您只需要将'RefreshToken'中间件添加到您的路由。 – Camilo

0

JWT_TTLJWT_REFRESH_TTLJWT_BLACKLIST_GRACE_PERIOD值在配置/ jwt.php文件设置好的。

它是如何工作:

  1. 客户端发送凭据(电子邮件和密码)Laravel和 接收响应令牌(JWT)。此令牌对JWT_TTL 分钟有效。在此期间,头部授权 =“不记名令牌”的所有请求都会成功。
  2. 对于在JWT_TTL分钟后发出的请求,即令牌过期,将出现两种情况:(1)如果自创建令牌以来少于JWT_REFRESH_TTL分钟(该令牌携带日期),那么这个令牌将被无效(黑名单),并且一个新的令牌将被生成并作为对客户端的响应发送。 JWT_REFRESH_TTL定义创建第一个令牌后多少分钟可以创建新的令牌。例如,对于JWT_REFRESH_TTL = 21600,将在15天内生成新的令牌,此后用户应重新进行验证。 (2)该请求发生在创建第一个标记后的JWT_REFRESH_TTL分钟后。在这种情况下,将不可能为客户端生成新的令牌,并且它必须再次进行验证。 401错误将被发送到客户端。
  3. 当多个并发请求使用相同的JWT 进行时,可能由于每个请求在 上重新生成令牌而导致其中一些失败。以秒为单位设置宽限期以防止并行 请求失败,因为JWT将认为对于 JWT_BLACKLIST_GRACE_PERIOD秒有效,即使它位于黑名单中。

欲了解更多详情,请参阅this my explanation

相关问题