Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在angularjs中使用拦截器刷新JWT令牌?_Angularjs_Jwt - Fatal编程技术网

如何在angularjs中使用拦截器刷新JWT令牌?

如何在angularjs中使用拦截器刷新JWT令牌?,angularjs,jwt,Angularjs,Jwt,我的应用程序后端实现在Lumen中,每次用户登录时都会提供一个JWT令牌。我使用Angular的前端将令牌保存在本地存储中,并且在后续请求中将其添加到所有头中。 通过创建我正在使用的请求来检查令牌到期并刷新 我将在应用程序的配置中添加令牌刷新代码,但当我发出任何其他请求时,从未调用此方法。这里是我尝试的代码 app.config(function Config($httpProvider, jwtInterceptorProvider) { jwtInterceptorProvider.

我的应用程序后端实现在Lumen中,每次用户登录时都会提供一个JWT令牌。我使用Angular的前端将令牌保存在本地存储中,并且在后续请求中将其添加到所有头中。 通过创建我正在使用的请求来检查令牌到期并刷新

我将在应用程序的配置中添加令牌刷新代码,但当我发出任何其他请求时,从未调用此方法。这里是我尝试的代码

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头中?

您应该考虑的要点

  • 您不应该更改tokenGetter函数中的默认头
  • 如果您的令牌已过期,则无法调用令牌端点
  • 您有两个选项,可以使用刷新令牌并向委托端点发出post请求,该委托端点使用刷新令牌获取新(未过期)令牌

    您可以使用委派端点更新JWT,并在令牌到期之前请求新的访问令牌。如果令牌已过期,并且没有刷新令牌,则实际上无法执行任何操作

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

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

    在令牌过期后使用刷新令牌获取新令牌的示例代码如下:

    angular.module('app',['angular-jwt']))
    .config(函数配置($httpProvider、jwtInterceptorProvider){
    jwtInterceptorProvider.tokenGetter=函数(jwtHelper,$http){
    var jwt=localStorage.getItem('jwt');
    var refreshttoken=localStorage.getItem('refresh_-token');
    如果(jwtHelper.isTokenExpired(jwt)){
    //这是JWT id_代币的承诺
    返回$http({
    url:“/委派”,
    //这将不会为此呼叫发送JWT
    skipAuthorization:没错,
    方法:“POST”,
    刷新令牌:刷新令牌
    }).然后(功能(响应){
    setItem('JWT',response.data.JWT');
    返回jwt;
    });
    }否则{
    返回jwt;
    }
    }
    $httpProvider.interceptors.push('jwtInterceptor');
    })
    

    如果您想了解有关刷新令牌及其工作方式的更多信息,可以查看此信息。

    这与我所做的差不多,但在令牌过期时不会触发请求。在您的实现中,我看不到任何刷新令牌,在您的示例代码中,此行缺少
    $httpProvider.interceptors.push('jwtInterceptor')我已经有了那行代码来注册拦截器,我已经更新了代码。发生的事情是,只有在我登录时才会调用拦截器,这是唯一一次检查令牌。对于进一步的请求,令牌没有被检查,因此我得到了一个401Ok,我得到了这个工作,问题出现在angular jwt库中,因为它在头中传递旧令牌。在参考和可能的情况下,我能够让它工作