使用PHP进行Web推送的JWT签名

问题描述

我正在尝试使用PHP发送网络推送通知。我已经阅读了有关如何实现Web推送协议的信息,例如here。但是,我认为我并没有真正走出本指南的作者解释如何形成Authorization标头的步骤。使用this库并给定由online generator创建的vapid密钥,我尝试了以下操作:

use Lcobucci\JWT\Builder;
use Lcobucci\JWT\Signer\Key;
use Lcobucci\JWT\Signer\Ecdsa\Sha256;

$signer = new Sha256();
$privateKey = new Key('<the generated private vapid key>');
$time = time();

$token = (new Builder())->permittedFor('https://example.com')
                        ->expiresAt($time + 3600)
                        ->withHeader('alg','ES256')
                        ->withClaim('sub','mailto:someone@example.com')
                        ->getToken($signer,$privateKey);

我想得到的是与<JWT Info>.<JWT Data>.<Signature>中的$token类似的东西。但是,出现错误

致命错误:未捕获invalidargumentexception:无法解析您的密钥,原因:错误:0909006C:PEM ...

有人知道我在这里做错了吗?提前非常感谢!

解决方法

内部有Lcobucci/jwt API uses both openssl_pkey_get_private()openssl_pkey_get_public()函数。

根据documentation,他们期望使用PEM编码的密钥,而这不是您提供的。这种键以 ------- BEGIN 前缀开头。