kit*_*sei 5 javascript php jwt angularjs laravel-4
我在角度/ laravel应用程序中实现JWT身份验证,我遇到令牌刷新问题.
这里有相关代码:
PHP:laravel-jwt监听器'监听' tymon.jwt.expired事件:
/**
* 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);
}
Run Code Online (Sandbox Code Playgroud)
PHP:'后'过滤器:
/*
|--------------------------------------------------------------------------
| 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());
}
}
});
Run Code Online (Sandbox Code Playgroud)
PHP:经过身份验证的路由过滤器:
Route::group(['before' => 'jwt-auth', 'after' => 'RefreshToken'], function () { ... });
Run Code Online (Sandbox Code Playgroud)
JS:更新localstorage的拦截器
'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;
}
}]);
Run Code Online (Sandbox Code Playgroud)
除了一个问题(工作流)之外,这很有效:
问题是如果在"续订"延迟期间从角度发送任何请求,则所有的请求都会被拒绝,因为令牌无效(列入黑名单).
我做错了吗?有人能指出我正确的方向吗?
我想要实现的是在约5分钟时设置令牌的ttl,并允许用户在导航时更新令牌.
| 归档时间: |
|
| 查看次数: |
3557 次 |
| 最近记录: |