1

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

我使用这本手册

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

对于通过 myJWTKey JWT 是

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJtZXJjdXJlIjp7InN1YnNjcmliZSI6W10sInB1Ymxpc2giOlsiKiJdfX0.iTVjHoLv9bB-O5RNnTtzOFxIW-YECk2JXZeMekZ4GwA 

我找到了一个令牌生成器(Signed JSON Web Token)

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

4

3 回答 3

2

你可以使用不同的库来做到这一点,一个非常简单和快速的库是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,类型:jwt)并为您设置有效负载。然后它将其编码为 base64 并对其进行签名。

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

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

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

同样对于该用例,您可以通过提供带有对象的有效负载键来在 cookie 中携带一些数据:

$payload = [
    'mercure' => [
        'subscribe' => ['*'],
        'payload' => [
            'userId' => $user->getId()
        ]
    ],
];
于 2020-06-23T10:42:35.367 回答
1

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

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

  1. 将工厂作为参数传递@mercure.hub.default.jwt.factory(这里default是您的集线器名称)
  2. 在您的服务/控制器中
public function generateJwt(LcobucciFactory $factory): string
{
    return $factory->create(['*']);
}

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

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

public function generateJwt(Request $request, Authorization $authorization): string
{
    return $authorization->createCookie($request, ['*'])->getValue();
}
于 2021-08-01T13:02:48.027 回答
0

为迟到的答案道歉,您只需jwt使用官方页面https://jwt.io/生成一次新令牌。

于 2020-03-25T20:05:09.127 回答