2015-04-14 2 views
8

Я использую jwt-auth, чтобы создать ресурс авторизации RESTful в моем API. Когда клиентское приложение вызывает ресурс входа в систему, регистр пользователя регистрируется, ваш текущий токен должен быть недействительным, и поэтому создается новый токен.Ошибка выхода с авторизацией Laravel JWT-auth

Но в этом случае текущий токен занесен в черный список TokenBlacklistedException.

Как проверить, включен ли токен? Или как исправить выполнение пользователем «выход из системы»? Я пытаюсь найти в источнике jwt-auth API, но не существует getToken()->isBlacklisted() или parseToken()->isBlacklisted() или какой-либо валидатор для его реализации.

Неверный токен parseToken() генерирует исключение TokenBlacklistedException, поэтому метод isBlacklisted является хорошим способом проверить, действительно ли токен действителен, прежде чем аннулировать токен.

INFO:

Рев код проверить, если полезная нагрузка является недействительным, забросив 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... 
} 

ответ

9

Вы можете просто уничтожить сеанс на стороне клиента, когда они выходят из системы и аннулируют токен на сервере, вам не нужно использовать черный список.

Технически уничтожить токен на стороне клиента будет достаточно, но для захвата сеанса, недействительным на бэкэнд также является хорошей идеей.

Если вы недействительны, вам нужно будет уничтожить токен после получения ответа от Laravel.

JWTAuth::invalidate(JWTAuth::getToken())): 

Тогда на угловой стороне

function logout() 
{ 
    UserService.logout().$promise.then(function() { 
     $cookieStore.remove('userToken'); 
     // redirect or whatever 
    }); 
} 

Один из способов обработки исключений JWT является установка в Laravel EventServiceProvider, вот что мое выглядит следующим образом:

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\[email protected]', 
     ], 
     'tymon.jwt.user_not_found' => [ 
      'App\Events\[email protected]' 
     ], 
     'tymon.jwt.invalid' => [ 
      'App\Events\[email protected]' 
     ], 
     'tymon.jwt.expired' => [ 
      'App\Events\[email protected]' 
     ], 
     'tymon.jwt.absent' => [ 
      'App\Events\[email protected]' 
     ] 
    ]; 

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

, но в моем случае, я тестирование, если Angular.js приложение отправить УТРАТИТ маркер, так что если недействительна 'JWTAuth :: Invalidate (JWTAuth :: getToken())):' отбросит TokenBlacklistedException или сказать, что недействительный маркер , Мне нужно, прежде чем сделать недействительным, проверить, выполнено ли это ранее. – Maykonn

+0

Или бросает TokenExpiredException, когда я пытаюсь сделать недействительным истекший токен ... – Maykonn

+0

Я обновил свой ответ, чтобы показать вам, как я обрабатываю его –

1

Насколько я понимаю, одна вещь, которую никто не подчеркивал это «jwt.refresh» (он же RefreshTokenMiddleware) используется для обновления маркера.

Теперь, если кто-то, кто хочет выполнить действие выхода из системы оборачивает метод контроллера в маршруте, как

Route::group(['middleware' => ['jwt.auth', 'jwt.refresh']], function()... 

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

Надеюсь, это поможет прояснить эту проблему.

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