You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony Mercure CookieGenerator.php生成JWT令牌报错求助

解决方案

1. 先明确Lcobucci JWT版本差异

你的问题核心是没适配Lcobucci JWT的版本API:v3和v4的Builder实例化、令牌生成逻辑完全不同,先检查composer.json里的版本,以下以当前主流的v4.x版本给出修复步骤:

2. 修复第24行:Builder实例化参数错误

v4.x不能直接new Builder(),必须通过Configuration类创建实例:

use Lcobucci\JWT\Configuration;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\Signer\Key\InMemory;

// 初始化JWT配置,传入签名算法和Mercure密钥
$config = Configuration::forSymmetricSigner(
    new Sha256(),
    InMemory::plainText('你的Mercure JWT密钥') // 替换为实际密钥
);

// 获取Builder实例
$builder = $config->builder();

3. 修复第27行:__toString()未定义错误

v4.x的Builder本身没有__toString()方法,需要先生成Token实例再转换为字符串:

// 构建符合Mercure要求的JWT令牌
$token = $builder
    ->issuedBy('你的应用域名') // iss声明,必填
    ->permittedFor('Mercure Hub的域名') // aud声明,必填
    ->expiresAt(new \DateTimeImmutable('+1 hour')) // 设置过期时间
    ->withClaim('mercure', ['subscribe' => ['*']]) // Mercure订阅权限,按需调整
    ->getToken($config->signer(), $config->signingKey());

// 转换为字符串用于生成Cookie
$jwtToken = $token->toString();
// 或者直接强制转换:$jwtToken = (string) $token;

完整修复示例片段

<?php

namespace YourNamespace;

use Lcobucci\JWT\Configuration;
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\Signer\Key\InMemory;

class CookieGenerator
{
    public function generateMercureCookie(): string
    {
        // 从环境变量读取密钥更安全
        $mercureSecret = getenv('MERCURE_JWT_SECRET');
        
        $config = Configuration::forSymmetricSigner(
            new Sha256(),
            InMemory::plainText($mercureSecret)
        );

        $token = $config->builder()
            ->issuedBy('https://your-app.example.com')
            ->permittedFor('https://mercure-hub.example.com')
            ->expiresAt(new \DateTimeImmutable('+1 hour'))
            ->withClaim('mercure', [
                'subscribe' => ['http://example.com/items/{id}'] // 按需设置订阅主题
            ])
            ->getToken($config->signer(), $config->signingKey());

        return $token->toString();
    }
}

注意事项

  • 如果你用的是v3.x版本,直接实例化Lcobucci\JWT\Builder,调用getToken()生成令牌后用(string) $token转换即可。
  • 确保Mercure的JWT密钥和代码中使用的完全一致,否则令牌验证会失败。
  • 必须包含mercure声明,这是Mercure识别令牌权限的核心。

内容的提问来源于stack exchange,提问作者Gengar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 18:20:04