【问题标题】:JWT key for mercure美居的 JWT 密钥
【发布时间】:2020-02-25 14:23:20
【问题描述】:

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

我使用这本手册

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

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

【问题讨论】:

    标签: symfony mercure


    【解决方案1】:

    您可以使用不同的库来执行此操作,一个非常简单且快速的库是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()
            ]
        ],
    ];
    

    【讨论】:

      【解决方案2】:

      只是对@Daidon 的一个很好的回答的补充。 Mercure 捆绑包使用 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();
      }
      

      【讨论】:

        【解决方案3】:

        抱歉迟到了,您只需使用官方页面https://jwt.io/生成新的jwt令牌。

        【讨论】:

        • jwt 应该不时重新创建,特别是如果您想使用授权。使用 jwt.io 没有帮助。
        猜你喜欢
        • 2017-12-02
        • 1970-01-01
        • 2017-10-15
        • 2018-10-17
        • 2023-04-04
        • 2021-05-10
        • 2018-04-13
        • 2019-02-21
        • 2019-07-30
        相关资源
        最近更新 更多