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
相关产品推荐
相关产品推荐

