laravel/angularjs JWT令牌刷新

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)

除了一个问题(工作流)之外,这很有效:

  • 令牌过期但仍可以续订
  • angular将带有过期令牌的http请求发送到服务器
  • laravel捕获请求并使用新令牌更新响应标头
  • laravel黑名单上一个标记

问题是如果在"续订"延迟期间从角度发送任何请求,则所有的请求都会被拒绝,因为令牌无效(列入黑名单).

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

我想要实现的是在约5分钟时设置令牌的ttl,并允许用户在导航时更新令牌.

kit*_*sei 1

这确实是库的一个错误,现已更正,请阅读此处以获取更多信息