2015-09-07 4 views
1

Im пытается обновить токен после того, как он истек, но я действительно потерял. Может ли кто-нибудь предоставить мне пример? Также после того, как я использовал фильтр доверенных прав, чтобы ограничить мои маршруты на основе роли пользователя im, получив другую ошибку сообщения, до {"error":"token_expired"}, сейчас (TokenExpiredException in PayloadValidator.php line 74:Token has expired).refresh jwt token laravel and angularJs

я использую типичный проверки подлинности с помощью JWT документации:

public function getAuthenticatedUser() 
{ 
    try { 

     if (! $user = JWTAuth::parseToken()->authenticate()) { 
      return response()->json(['user_not_found'], 404); 
     } 

    } catch (Tymon\JWTAuth\Exceptions\TokenExpiredException $e) { 

     return response()->json(['token_expired'], $e->getStatusCode()); 

    } catch (Tymon\JWTAuth\Exceptions\TokenInvalidException $e) { 

     return response()->json(['token_invalid'], $e->getStatusCode()); 

    } catch (Tymon\JWTAuth\Exceptions\JWTException $e) { 

     return response()->json(['token_absent'], $e->getStatusCode()); 

    }    

    return response()->json(compact('user')); 


} 

ответ

0

Я просто удалось решить эту проблему. Вот как:

В том же контроллере, как getAuthenticatedUser() и authenticate() методы проживает, я поставил маркер метод обновления:

public function refresh(Request $request) 
{ 
    try { 

     $current_token = $request->get('token'); 
     //$current_token = JWTAuth::getToken(); 
     if(!$current_token) return response()->json(null); 

     $token = JWTAuth::refresh($current_token); 
     return response()->json(compact('token')); 

    } catch (JWTException $e) { 
     if ($e instanceof TokenExpiredException) { 
      return response()->json(['token_expired'], $e->getStatusCode()); 
     } else if ($e instanceof TokenBlacklistedException) { 
      return response()->json(['token_blacklisted'], $e->getStatusCode()); 
     } else if ($e instanceof TokenInvalidException) { 
      return response()->json(['token_invalid'], $e->getStatusCode()); 
     } else if ($e instanceof PayloadException) { 
      return response()->json(['token_expired'], $e->getStatusCode()); 
     } else if ($e instanceof JWTException) { 
      return response()->json(['token_invalid'], $e->getStatusCode()); 
     } 
    } 
} 

И соответствующий маршрут:

Route::post('authenticate', '[email protected]'); 
Route::post('refresh', '[email protected]'); // The new route. 

Теперь, так как мы» используя AngularJS для нашего интерфейса и всех HTTP-запросов, мы определяем, истек ли токен оттуда. Не уверен, что это относится к вашему проекту, но, возможно, вы можете использовать логический принцип.

Если вы не используете AngularJS для своего интерфейса и не заинтересованы в нашей логике frontend, которая построена в AngularJS, вы можете прекратить читать сейчас.

В нашем главном AngularJS файле, app.js, где мы используем UI-Router для государственной основе маршрутизации (и jwtHelper-library):

app.run(function($rootScope, $state jwtHelper, AuthFactory) { 

    // Checks if the token has expired on every view change. 
    $rootScope.$on('$stateChangeStart', function(e, to) { 
     if (to.data.requiresLogin && jwtHelper.isTokenExpired(store.get('token')) { 
      AuthFactory.attemptRefreshToken(); 
     } 
    }); 
}); 

// We use a http interceptor to listen for the Token Expired-exception 
// coming from the backend (Laravel 5.1 and JWTAuth) on any http calls performed. 
app.config(function ($httpProvider) { 
    $httpProvider.interceptors.push('httpInterceptor'); 
}); 

// The actual interceptor. 
app.factory('httpInterceptor', function ($q, store, $injector) { 
    return { 

     // On every request that returns an error, check if the status code is 
     // 401 ('unauthorized'), which means the token has expired. 
     responseError: function(response) { 
      if (response.status == 401){ 
       var AuthFactory = $injector.get('AuthFactory'); 

       // Pass the attempted response config in order to retry the request after the refresh. 
       return AuthFactory.attemptRefreshToken(response.config); 
      } 
     } 
    }; 
}); 

И последнее, но не в последнюю очередь, наш фактический вызов обновления, который хранится в нашем AuthFactory файл:

attemptRefreshToken: function(requestTodoWhenDone){ 
    var token = store.get('token'); 
    return $http({ 
      method: 'POST', 
      skipAuthorization: true, 
      url: ApiEndpoint.url + 'refresh', 
      data: {token: token} 
     }) 
     .success(function(response) 
     { 
      // Set the refreshed token. 
      store.set('token', response.token); 
     }) 
     .then(function(){ 

      // Attempt to retry the request if request config is passed. 
      if(!angular.isUndefined(requestTodoWhenDone) && requestTodoWhenDone.length > 0) 
      { 
       // Set the new token for the authorization header. 
       requestTodoWhenDone.headers = { 
        'Authorization': 'Bearer ' + store.get('token') 
       }; 

       // Run the request again. 
       return $http(requestTodoWhenDone); 
      } 
     }); 
}); 
+0

это на самом деле работает, но у меня есть проблема, где черная список мой новый маркер, у меня есть почти такая же установка, как у вас есть я просто использовать satellizer к посланным лексемам и я хранить их в LocalStorage. –

+0

Правильно, мы заметили это довольно скоро. После моего ответа мы сделали следующее: - Нам пришлось ловить черные списки в качестве исключения в бэкэнде, чтобы сделать Angular обнаруженным, если маркер в черный список или нет. - Мы также перенесли HTTP-запрос с завода на главный app.js из-за некоторой ошибки, с которой я не знаком. - Мы отправляем токен в качестве параметра запроса вместо использования встроенного auth в JWT. См. Мой обновленный ответ. – Mattias

Смежные вопросы