美居的 JWT 密钥

JWT key for mercure

我尝试为 Mercure 设置生成 JWT 密钥

我用这个手册

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 的设置。我该怎么做?我想念什么?

我尝试为环境设置生成令牌

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 - 我如何生成令牌?

抱歉回答晚了,您可以使用官方页面 https://jwt.io/.

生成新的 jwt 令牌

你可以使用不同的库来做到这一点,一个非常简单和快速的库是 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

该库将自动注入您需要的 headers(默认值:alg HS256,典型值:jwt)并为您设置负载。然后将其编码为 base64 并对其进行签名。

继续使用此 jwt 设置 cookie 或在授权中使用它 header 现在:-)

如果您想使用 JWT 进行订阅者身份验证,请不要忘记将订阅密钥放入有效负载中。

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

同样对于该用例,您可以通过提供带有 object:

的有效负载密钥来在 cookie 中携带一些数据
$payload = [
    'mercure' => [
        'subscribe' => ['*'],
        'payload' => [
            'userId' => $user->getId()
        ]
    ],
];

只是对@Daidon 的精彩回答的补充。 Mercure bundle 使用 lcobucci/jwt 并将其工厂注册为服务。

如果要生成 JWT,请执行以下操作

  1. 使用 @mercure.hub.default.jwt.factory 将工厂作为参数传递(此处 default 是您的集线器名称)
  2. 在你的service/controller
public function generateJwt(LcobucciFactory $factory): string
{
    return $factory->create(['*']);
}

更新:获取 JWT 令牌的更简单方法

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Mercure\Authorization;

public function generateJwt(Request $request, Authorization $authorization): string
{
    return $authorization->createCookie($request, ['*'])->getValue();
}