【问题标题】:JWT signature for web push using PHP使用 PHP 进行 Web 推送的 JWT 签名
【发布时间】:2020-08-28 07:49:51
【问题描述】:

我正在尝试使用 PHP 发送网络推送通知。我已经阅读了如何实现网络推送协议,例如here。但是,我认为我并没有真正理解本指南的作者解释如何形成授权标头的步骤。使用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);

我想得到类似于&lt;JWT Info&gt;.&lt;JWT Data&gt;.&lt;Signature&gt;$token 的东西。但是,我得到一个错误。

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

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

【问题讨论】:

  • 我不知道 VAPID 密钥是什么,但您的 $signer 可以与 ECDSA 密钥一起使用。鉴于我使用您提供的 VAPID 生成器得到的结果,我很确定这不是 ECDSA 密钥。
  • specification 中,它在第 2 节中说这些密钥必须在 P-256 曲线上与椭圆曲线数字签名算法 (ECDSA) 一起使用

标签: php jwt web-push vapid


【解决方案1】:

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

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

【讨论】:

  • 完全正确。在线生成器为我们提供了密钥的“最终版本”,可以与最流行的 Node.js 模块一起使用。我们可以使用我发现的 openssl 命令在纯文本文件中创建 .pem 文件和 VAPID 密钥here
猜你喜欢
  • 2018-03-27
  • 2021-02-10
  • 2018-05-04
  • 2020-11-09
  • 2017-11-12
  • 2022-08-06
  • 2016-12-16
  • 1970-01-01
  • 2023-01-08
相关资源
最近更新 更多