Javascript laravel/angularjs JWT令牌刷新
我正在angular/laravel应用程序中实现JWT身份验证,但令牌刷新有问题 以下是相关代码: PHP:laravel jwt侦听器,用于“侦听”tymon.jwt.expired事件: PHP:after过滤器: JS:更新本地存储的拦截器 除了一个问题(工作流程)外,该方法工作正常:Javascript laravel/angularjs JWT令牌刷新,javascript,php,angularjs,laravel-4,jwt,Javascript,Php,Angularjs,Laravel 4,Jwt,我正在angular/laravel应用程序中实现JWT身份验证,但令牌刷新有问题 以下是相关代码: PHP:laravel jwt侦听器,用于“侦听”tymon.jwt.expired事件: PHP:after过滤器: JS:更新本地存储的拦截器 除了一个问题(工作流程)外,该方法工作正常: 令牌过期,但仍可以续订 向服务器发送带有过期令牌的http请求 laravel捕获请求并使用新令牌更新响应头 laravel将上一个令牌列入黑名单 问题是,如果在“续订”延迟期间从angular发送任
- 令牌过期,但仍可以续订
- 向服务器发送带有过期令牌的http请求
- laravel捕获请求并使用新令牌更新响应头
- laravel将上一个令牌列入黑名单
我想要实现的是将令牌的ttl设置为大约5分钟,并允许用户在导航时续订令牌。也许您使用的是异步请求?然后,您不确定是否发送了最新的令牌
在这种情况下,您不应该在每次请求后都使用刷新方法。这确实是库中的一个错误,现已更正,有关更多信息,我也遇到了同样的问题。刷新令牌时,最后一个令牌将被列入黑名单。
但是,如果在上次响应之前启动了另一个异步调用,则需要此令牌。因此,解决方案可以是延迟将最后一个令牌列入黑名单。您可以通过在
JWT.php
config文件中设置JWT\u黑名单\u宽限期
来实现这一点。♥♥♥ Laravel 5.0中的相同问题。您解决了这个问题吗?我对这个解决方案也很感兴趣嘿,这似乎是一个已知的问题,检查这里,应该有一个解决方案:这个问题就是我评论的问题,我会给出一个答案,这样其他人可以很容易地找到它
/**
* Fired when the token has expired
* @param \Exception $e
* @return \Illuminate\Http\JsonResponse
*/
public function expired($e)
{
$token = \JWTAuth::parseToken();
Config::package('tymon/jwt-auth', 'jwt');
$ttl = Config::get('jwt::refresh_ttl');
$iat = Carbon::createFromTimestamp($token->getPayload()->get('iat'));
$now = Carbon::now();
// if renew ttl is expired too, return 401, otherwise let
// the application generate a new token to frontend
if ($iat->diffInMinutes($now) >= $ttl) {
unset($iat, $now, $ttl);
return response_failure(
Lang::get('errors.api.auth.expired'),
Config::get('status.error.unauthorized')
);
}
unset($iat, $now, $ttl);
}
/*
|--------------------------------------------------------------------------
| JWT-Auth token-refresh Filter
|--------------------------------------------------------------------------
|
| The RefreshToken filter update the response headers by returning an
| updated authentication token.
|
*/
Route::filter('RefreshToken', function($route, $request, $response)
{
$token = JWTAuth::parseToken();
try {
$token->toUser();
} catch (TokenExpiredException $e) {
Config::package('tymon/jwt-auth', 'jwt');
$ttl = Config::get('jwt::refresh_ttl');
$iat = \Carbon\Carbon::createFromTimestamp($token->getPayload()->get('iat'));
$now = \Carbon\Carbon::now();
if ($iat->diffInMinutes($now) < $ttl) {
$response->headers->set('Authorization', 'Bearer ' . $token->refresh());
}
}
});
Route::group(['before' => 'jwt-auth', 'after' => 'RefreshToken'], function () { ... });
'use strict';
angular.module('App')
.factory('ResponseInterceptor', ['SessionService', 'jwtHelper', '$location', '$q',
function (SessionService, jwtHelper, $location, $q) {
return {
response: response
};
// called for http codes up to 300
function response(response) {
var token = response.headers('Authorization');
if ('undefined' !== typeof token && null !== token) {
SessionService.setToken(token.split(' ')[1]);
}
return response;
}
}]);