Как получить getUser из JWT в контроллере Symfony?

Для получения пользователя (getUser) из JWT в контроллере Symfony, вам нужно выполнить несколько шагов.

1. Установите и настройте пакет LexikJWTAuthenticationBundle. Установите пакет через Composer, добавив его в ваш файл composer.json и запустив команду composer.json:

composer require lexik/jwt-authentication-bundle

Затем добавьте пакет в ваш файл config/bundles.php:

return [
    // ...
    LexikBundleJWTAuthenticationBundleLexikJWTAuthenticationBundle::class => ['all' => true],
];

Конфигурация JWT также должна быть настроена в файле config/packages/lexik_jwt_authentication.yaml. Вот пример настройки:

lexik_jwt_authentication:
    secret_key: '%kernel.project_dir%/.env.local' 
    public_key: '%kernel.project_dir%/.env.local.pub'
    pass_phrase: '%env(APP_SECRET)%'
    token_ttl: 3600

2. Создайте метод аутентификации в вашем контроллере, который будет проверять JWT токен для аутентификации пользователя. Вот пример контроллера:

use SymfonyComponentSecurityCoreExceptionAuthenticationException;
use SymfonyComponentSecurityCoreUserUserInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationJsonResponse;
use LexikBundleJWTAuthenticationBundleServicesJWTTokenManagerInterface;

class UserController extends AbstractController
{
    private $jwtManager;

    public function __construct(JWTTokenManagerInterface $jwtManager)
    {
        $this->jwtManager = $jwtManager;
    }

    public function authenticateUser(Request $request)
    {
        // Получение JWT токена из запроса
        $jwtToken = $request->headers->get('Authorization');

        try {
            // Проверка и расшифровка токена
            $payload = $this->jwtManager->decode($jwtToken);

            // Если токен проверен успешно, получаем пользователя из базы данных
            $user = $this->getDoctrine()->getRepository(User::class)->findOneBy(['id' => $payload['id']]);

            // Возвращаем пользователя в формате JSON
            return new JsonResponse(['user' => $user->getUsername()]);
        } catch (AuthenticationException $ex) {
            // Обработка ошибки аутентификации
        }
    }
}

В данном примере мы предполагаем, что токен передается в заголовке запроса "Authorization". Проверка и расшифровка токена выполняется с использованием метода decode() из JWTTokenManagerInterface.

3. Теперь, когда у вас есть метод аутентификации, его можно вызвать в других методах контроллера, где вам необходимо получить пользователя из JWT токена. Например:

use SymfonyBundleFrameworkBundleControllerAbstractController;

class SomeController extends AbstractController
{
    public function someAction(Request $request)
    {
        // Вызываем метод аутентификации для получения пользователя
        $user = $this->authenticateUser($request);

        // Далее можно использовать пользователя в своей логике
        // ...
    }
}

В результате, вы сможете получить пользователя из JWT токена в контроллере Symfony. Это позволит вам аутентифицировать запросы и использовать данные пользователя в вашей логике приложения.