Ключ JWT для mercure

Я пытаюсь создать ключ JWT для настроек Mercure

Я использую это руководство

https://medium.com/@stefan.poeltl/instant-realtime-notifications-with-symfony-and-mercure-e45270f7c8a5

для передачи myJWTKey JWT - это

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJtZXJjdXJlIjp7InN1YnNjcmliZSI6W10sInB1Ymxpc2giOlsiKiJdfX0.iTVjHoLv9bB-O5RNnTtzOFxIW-YECk2JXZeMekZ4GwA 

Я нашел конструктор токенов (подписанный веб-токен JSON)

http://jwtbuilder.jamiekurtz.com/

но я не нашел настройки, которая генерирует правильный JWT. Как мне это сделать? Что я скучаю?

Я попытался сгенерировать токен для настроек env

MERCURE_PUBLISH_URL=http://mercure.dev:3000/.well-known/mercure
# The default token is signed with the secret key: !ChangeMe!
MERCURE_JWT_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJtZXJjdXJlIjp7InN1YnNjcmliZSI6W10sInB1Ymxpc2giOlsiKiJdfX0.iTVjHoLv9bB-O5RNnTtzOFxIW-YECk2JXZeMekZ4GwA
###< symfony/mercure-bundle ###

Этот токен используется для пароля по умолчанию в docker-compose

 mercure:
      image: dunglas/mercure
      environment:
        # You should definitely change all these values in production
        - JWT_KEY=myJWTKey
        - DEMO=1
        - ALLOW_ANONYMOUS=1
        - HEARTBEAT_INTERVAL=30s
        - ADDR=:3000

если я изменю myJWTKey на mysecure pass - как я могу сгенерировать токен?

3 ответа

Решение

Извинитесь за поздний ответ, вы можете просто создать новый jwtтокен один раз на официальной странице https://jwt.io/.

Для этого можно использовать разные библиотеки, очень простой и быстрой - php-jwt.

Тогда сделай

composer require firebase/php-jwt

А в коде вы можете сделать следующее:

use \Firebase\JWT\JWT;

$key = "12345678";
$payload = [
    'mercure' => [
        'publish' => ['*'],
    ],
];
$jwt = JWT::encode($payload, $key); // holds valid jwt now

Библиотека автоматически вставит нужные заголовки (по умолчанию: alg HS256, typ: jwt) и установит полезную нагрузку за вас. Затем он кодирует его в base64 и также подписывает.

Продолжайте и установите cookie с этим jwt или используйте его в заголовке авторизации сейчас:-)

Если вы хотите использовать JWT для аутентификации подписчика, не забудьте указать ключ подписки в полезной нагрузке.

$payload = [
    'mercure' => [
        'subscribe' => ['*'], // make this a list of concrete topics, don't use *
    ],
];

Также для этого варианта использования вы можете переносить некоторые данные в cookie, предоставив ключ полезной нагрузки с объектом:

$payload = [
    'mercure' => [
        'subscribe' => ['*'],
        'payload' => [
            'userId' => $user->getId()
        ]
    ],
];

Просто дополнение к отличному ответу @Daidon. Пакет Mercure использует lcobucci / jwt и регистрирует его фабрику как службу.

Если вы хотите сгенерировать JWT, сделайте следующее

  1. Передайте фабрику в качестве аргумента с @mercure.hub.default.jwt.factory (здесь default для имени вашего хаба)
  2. В вашем сервисе / контроллере
      public function generateJwt(LcobucciFactory $factory): string
{
    return $factory->create(['*']);
}
Другие вопросы по тегам