2016-08-08 82 views
3

我在Lumen中有我的应用程序后端实现,它在每次用户登录时都会给出一个JWT令牌。前端我使用Angular将令牌保存在本地存储中,并且我将它添加到所有标题在随后的请求中。 要检查令牌期满并通过创建一个请求刷新我使用https://github.com/auth0/angular-jwt如何在angularjs中使用拦截器刷新JWT令牌?

我在应用程序的配置添加了凭证更新代码,但是当我在这里做任何其他的要求是该方法不会被调用我试过的代码。

app.config(function Config($httpProvider, jwtInterceptorProvider) { 


    jwtInterceptorProvider.tokenGetter = function(jwtHelper, $http,$localStorage) { 

    if ($localStorage.currentUser) { 
    var token = $localStorage.currentUser.token; 
    if (jwtHelper.isTokenExpired(token)) { 

     return $http({ 
     url: 'http://backend.mywebsite.com/token', 
     method: 'GET' 
     }).then(function(response) { 
     var token = response.token; 
     $localStorage.currentUser.token = token; 
     $http.defaults.headers.common.Authorization = 'Bearer ' + $localStorage.currentUser.token; 
     return token; 
     }); 
    } else { 
     return token; 
    } 
    } 
} 
$httpProvider.interceptors.push('jwtInterceptor'); 
}); 

我想知道如何配置此功能,以便每当令牌过期时它会自动刷新并设置在http头中?

回答

4

点,你应该考虑

  1. 你不应该改变tokenGetter函数内部的默认标头。
  2. 如果您的令牌已过期,则无法调用令牌端点。

您有两个选择,您可以使用刷新标记并向使用刷新标记获取新(未过期)标记的委派端点发出发布请求。

OR

你可以用一个代表团的端点和请求令牌到期令牌之前新的访问更新JWT。如果令牌已过期并且没有refresh_token,那么您无法做任何事情。

A 刷新令牌是一种特殊类型的JWT,用于对用户进行身份验证而不需要重新进行身份验证。它携带获取新访问令牌所需的信息。

换句话说,无论何时需要访问令牌来访问特定资源,客户端都可以使用刷新令牌来获取由验证服务器发出的新访问令牌。像你这样的常见用例包括在旧的令牌过期后获得新的访问令牌,或者第一次访问新的资源。刷新令牌也可以过期,但寿命相当长。

使用一个刷新令牌获得新令牌的样本代码示例后,令牌过期可以发现如下:

angular.module('app', ['angular-jwt']) 
    .config(function Config($httpProvider, jwtInterceptorProvider) { 
     jwtInterceptorProvider.tokenGetter = function(jwtHelper, $http) { 
      var jwt = localStorage.getItem('JWT'); 
      var refreshToken = localStorage.getItem('refresh_token'); 

      if (jwtHelper.isTokenExpired(jwt)) { 
       // This is a promise of a JWT id_token 
       return $http({ 
        url: '/delegation', 
        // This will not send the JWT for this call 
        skipAuthorization: true, 
        method: 'POST', 
        refresh_token : refreshToken 
       }).then(function(response) { 
        localStorage.setItem('JWT', response.data.jwt); 
        return jwt; 
       }); 
      } else { 
       return jwt; 
      } 
     } 
     $httpProvider.interceptors.push('jwtInterceptor'); 
    }) 

如果您想了解更多信息有关刷新令牌,以及它们如何工作,你可以看看这个article

+0

这与我所做的或多或少相似,但这不会在令牌过期时触发请求。 – Rishabh

+0

在您的实现中,我看不到任何刷新标记,并且在示例代码中,此行缺少'$ httpProvider.interceptors.push('jwtInterceptor');' – unicodeveloper

+0

我已经有了该行来注册拦截器,更新了代码。发生的事情是拦截器只在我登录时被调用,这是唯一一次检查令牌。为进一步请求令牌不检查,因此我得到一个401 – Rishabh