Ключ JWT для mercure
Я пытаюсь создать ключ JWT для настроек Mercure
Я использую это руководство
для передачи 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, сделайте следующее
- Передайте фабрику в качестве аргумента с
@mercure.hub.default.jwt.factory
(здесьdefault
для имени вашего хаба) - В вашем сервисе / контроллере
public function generateJwt(LcobucciFactory $factory): string
{
return $factory->create(['*']);
}