Я использую jwt-auth для создания ресурса autost в RESTful в моем API. Когда клиентское приложение вызывает ресурс входа в систему, регистр пользователя регистрируется, ваш текущий токен должен быть недействительным, и поэтому создается новый токен.
Но случай, когда текущий токен занесен в черный список, TokenBlacklistedException
.
Как проверить, включен ли токен? Или как исправить выполнение пользователем «выход из системы»? Я пытаюсь найти в источнике jwt-auth API, но не существует getToken()->isBlacklisted()
или parseToken()->isBlacklisted()
или некоторый валидатор для его реализации.
Когда-либо токен недействителен, parseToken () выдает исключение TokenBlacklistedException, поэтому метод isBlacklisted является хорошим способом проверить, действительно ли токен действителен, прежде чем сделать недействительным токен.
ИНФОРМАЦИЯ:
Следующий код проверяет, является ли полезная информация недопустимой, выбрасывается TokenBlacklistedException
если оно TokenBlacklistedException
:
if( false === \Tymon\JWTAuth\Blacklist::has( \Tymon\JWTAuth\Facades\JWTAuth::getPayload($token) ) ) { \Tymon\JWTAuth\Facades\JWTAuth::parseToken()->invalidate(); }
Как проверить, как:
if(false ===\Tymon\JWTAuth\Facades\JWTAuth::parseToken()->isBlacklisted()) { // invalidate... }
Вы можете просто уничтожить сеанс на стороне клиента, когда они выходят из системы и аннулируют токен на сервере, вам не нужно использовать черный список.
Технически уничтожить токен на стороне клиента будет достаточно, но для захвата сеанса, недействительным это на бэкэнде тоже хорошая идея.
Если вы недействительны, вам нужно будет уничтожить токен после получения ответа от Laravel.
JWTAuth::invalidate(JWTAuth::getToken())):
Затем на угловой стороне
function logout() { UserService.logout().$promise.then(function() { $cookieStore.remove('userToken'); // redirect or whatever }); }
Один из способов, которыми вы можете справиться с исключениями JWT, – это настроить EventServiceProvider
в laravel, вот что выглядит мое:
use Illuminate\Contracts\Events\Dispatcher as DispatcherContract; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider { /** * The event handler mappings for the application. * * @var array */ protected $listen = [ 'tymon.jwt.valid' => [ 'App\Events\JWTEvents@valid', ], 'tymon.jwt.user_not_found' => [ 'App\Events\JWTEvents@notFound' ], 'tymon.jwt.invalid' => [ 'App\Events\JWTEvents@invalid' ], 'tymon.jwt.expired' => [ 'App\Events\JWTEvents@expired' ], 'tymon.jwt.absent' => [ 'App\Events\JWTEvents@missing' ] ]; /** * Register any other events for your application. * * @param \Illuminate\Contracts\Events\Dispatcher $events * @return void */ public function boot(DispatcherContract $events) { parent::boot($events); // } }
Вы зарегистрируете это в своем app.php.
Затем я реализую класс JWTEvents с методами для каждого события.
class JWTEvents extends Event { // Other methods public function invalid() { return response()->json(['error' => 'Token Invalid'], 401); die(); } }
Важно отметить, что мы ловим исключения JWT и возвращаем ответ json с определенным кодом состояния.
С угловой стороны у меня в классе httpInterceptor, ловится для этих кодов статуса http.
angular.module('ngApp') .factory('httpInterceptor', function($q, $log, $cookieStore, $rootScope, Response) { return { request: function(config) { // Where you add the token to each request }, responseError: function(response) { // Check if response code is 401 (or whatever) if (response.status === 401) { // Do something to log user out & redirect. $rootScope.$broadcast('invalid.token'); } } } });
Насколько я понимаю, одно, что никто не подчеркивал, это «jwt.refresh» (также известный как RefreshTokenMiddleware), используемый для обновления токена.
Теперь, если любой, кто хочет выполнить действие выхода из системы, переносит метод контроллера в маршрут, например
Route::group(['middleware' => ['jwt.auth', 'jwt.refresh']], function()...
наверняка получит новый токен в ответ на выход, поэтому клиент сможет выполнять новые запросы.
Надеюсь, это поможет прояснить эту проблему.