Я пытаюсь защитить некоторые файлы через 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.
Есть идеи?
Спасибо! Эта ссылка помогла мне найти ответ






Я решил это сейчас. Сначала создайте токен и добавьте любые данные, чтобы определить вариант его использования. Я использую, например, область видимости:
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
}
Вы можете интегрировать свою дату истечения срока действия в полезную нагрузку токена JWT при создании JWT и проверять ее при декодировании. На мой взгляд, вы также можете использовать LexikJWTAuthenticationBundle для программной установки даты истечения срока действия токена JWT.