Я просто удалось решить эту проблему. Вот как:
В том же контроллере, как 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);
}
});
});
это на самом деле работает, но у меня есть проблема, где черная список мой новый маркер, у меня есть почти такая же установка, как у вас есть я просто использовать satellizer к посланным лексемам и я хранить их в LocalStorage. –
Правильно, мы заметили это довольно скоро. После моего ответа мы сделали следующее: - Нам пришлось ловить черные списки в качестве исключения в бэкэнде, чтобы сделать Angular обнаруженным, если маркер в черный список или нет. - Мы также перенесли HTTP-запрос с завода на главный app.js из-за некоторой ошибки, с которой я не знаком. - Мы отправляем токен в качестве параметра запроса вместо использования встроенного auth в JWT. См. Мой обновленный ответ. – Mattias