gpt4 book ai didi

javascript - laravel/angularjs JWT token 刷新

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:47:28 26 4
gpt4 key购买 nike

我正在 angular/laravel 应用程序中实现 JWT 身份验证,但我遇到了 token 刷新问题。

这里是相关代码:

PHP:“监听”tymon.jwt.expired 事件的 laravel-jwt 监听器:

    /**
* 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);
}

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());
}
}
});

PHP:经过身份验证的路由过滤器:

Route::group(['before' => 'jwt-auth', 'after' => 'RefreshToken'], function () { ... });

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;
}
}]);

除一个问题(工作流程)外,此方法运行良好:

  • token 过期但仍可续订
  • angular 向服务器发送带有过期 token 的 http 请求
  • laravel 捕获请求并使用新 token 更新响应 header
  • laravel 将之前的 token 列入黑名单

问题是,如果在“更新” 延迟期间从 Angular 发送任何请求,所有这些请求都会被服务器拒绝,因为 token 无效(列入黑名单)。

我做错了吗?有人可以指出我正确的方向吗?

我想要实现的是将 token 的 ttl 设置为大约 5 分钟,并允许用户在导航时更新 token 。

最佳答案

这确实是图书馆的一个错误,现在已更正,read here了解更多信息

关于javascript - laravel/angularjs JWT token 刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29098818/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com