Создание токена JWT с коротким сроком действия с помощью LexikJWTAuthenticationBundle

Я пытаюсь защитить некоторые файлы через Symfony. Допустим, я получаю к ним доступ по следующему URL-адресу:

https://test.com/file/?token=AAAABBBBCCCC

Я уже реализовал авторизацию через LexikJWTAuthenticationBundle. я вхожу в систему; получить токен доступа - это работает просто отлично. Поэтому я использовал свой токен доступа для входа в систему, чтобы ввести URL-адрес.

Но токены входа имеют слишком долгий срок службы. Поэтому я подумал о создании токена с коротким временем жизни (< 2 секунд), чтобы просто получить доступ к файлу один раз. Как только я обновлю страницу, доступ к файлу должен исчезнуть.

На странице symfony я узнал, как создать токен: $JWTManager->create($user) (https://symfony.com/bundles/LexikJWTAuthenticationBundle/current/7-manual-token-creation.html)

Но я не могу настроить срок жизни этого токена. Обычно это настраивается в lexik_jwt_authentication.yaml, но я не хочу менять срок жизни токена входа :/

Я использую Симфони 5.

Есть идеи?

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

Hans Wurst 13.05.2023 10:21

Спасибо! Эта ссылка помогла мне найти ответ

user3356082 15.05.2023 21:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я решил это сейчас. Сначала создайте токен и добавьте любые данные, чтобы определить вариант его использования. Я использую, например, область видимости:

public function createToken(JWTTokenManagerInterface $jwt): JsonResponse
{
    $token = $jwt->createFromPayload(
        $this->getUser(),
        ['scope' => 'fileScope']
    );

    return new JsonResponse($token);
}

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

// EventListener/JWTCreatedListener.php

declare(strict_types=1);

namespace App\EventListener;

use App\Controller\Authentication\GetDocumentFileToken;
use Lexik\Bundle\JWTAuthenticationBundle\Event\JWTCreatedEvent;

/**
 * Class JWTCreatedListener
 */
class JWTCreatedListener
{
    /**
     * @param JWTCreatedEvent $event
     *
     * @return void
     */
    public function onJWTCreated(JWTCreatedEvent $event): void
    {
        $payload = $event->getData();

        if (($payload['scope'] ?? '') === 'fileScope') {
            $expiration = new \DateTime('+1 minute');
            $payload['exp'] = $expiration->getTimestamp();
        }

        $event->setData($payload);
    }
}

А затем в контроллере, где разрешены только определенные токены области:

public function getDocumentFile(JWTTokenManagerInterface $jwt): JsonResponse
{
    $token = /* Get token from request or something */;
    $tokenData = $jwt->parse($token);

    if (($tokenData['scope'] ?? '') !== 'fileScope') {
        return new JsonResponse('Permission denied', 400);
    }

    // Token is valid and fileScope so output file
}

Другие вопросы по теме