Laravel JWT обновит токен tymon с истекшим сроком действия

#php #laravel #authentication #jwt

Вопрос:

Я внедрил пакет Laravel JWT, jwt-auth версии 1.0.2 в свой проект Laravel 8, который действует как API.

В моем интерфейсе Nuxt JS используется модуль аутентификации Nuxt и поставщик JWT Laravel.

Я сохранил большую часть конфигурации прежней, но изменил JWT_TTL ее, чтобы она составляла 2 минуты для тестирования.

В примере AuthController, настроенном для пакета проверки подлинности JWT, refresh метод обновляет маркер, который, очевидно, делает недействительным предыдущий маркер, однако в настоящее время эта функция находится за auth промежуточным ПО, и промежуточное ПО проверки подлинности необходимо, чтобы проверить, вошел ли кто-то в систему.

Проблема, с которой я столкнулся в настоящее время, заключается в том, что, как только мой access_token срок действия истекает и мой интерфейс запрашивает новый токен, старый токен автоматически предоставляется в качестве Authorisation заголовка, но refresh конечная точка возвращает ошибку 401, не прошедшую проверку подлинности.

Если я добавлю refresh в список исключенных промежуточное программное обеспечение auth, оно будет работать по назначению, но я чувствую, что это сопряжено с риском для безопасности?

Может быть, я упускаю что-то очевидное?

AccountController.php

 <?php

namespace AppHttpControllers;

use IlluminateSupportFacadesAuth;
use IlluminateSupportFacadesHash;
use IlluminateSupportFacadesValidator;
use IlluminateHttpRequest;
use AppModelsUser;
use AppModelsUserSetting;
use CarbonCarbon;

class AccountController extends Controller
{
    /**
     * Instantiate a new DomainsController instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth:api', [
            'except' => ['store', 'login', 'refresh']
        ]);
    }

    /**
     * Store a newly created resource in storage. (create account)
     *
     * @param  IlluminateHttpRequest  $request
     * @return IlluminateHttpResponse
     */
    public function store(Request $request)
    {
        // ...
    }

    /**
     * Log in
     *
     * @return IlluminateHttpResponse
     */
    public function login(Request $request)
    {
        // ...
    }

    /**
     * Refresh a token.
     *
     * @return IlluminateHttpJsonResponse
     */
    public function refresh()
    {
        return $this->respondWithToken(auth()->refresh());
    }
}
 

Controller.php

 <?php

namespace AppHttpControllers;

use IlluminateFoundationAuthAccessAuthorizesRequests;
use IlluminateFoundationBusDispatchesJobs;
use IlluminateFoundationValidationValidatesRequests;
use IlluminateRoutingController as BaseController;
use IlluminateSupportFacadesAuth;

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    /**
     * Get the token array structure.
     *
     * @param  string $token
     *
     * @return IlluminateHttpJsonResponse
     */
    protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type' => 'Bearer',
            'expires_in' => auth()->factory()->getTTL() * 60
        ]);
    }
}
 

Maybe I can retain the refresh exclusion for this middleware and then add some custom logic to my refresh method?

enter image description here