从以下项生成的密钥: https://web-push-codelab.glitch.me/
响应已通过以下验证:https://jwt.io/
返回的令牌有效!但我在chrome开发人员控制台中收到以下错误: “提供了无效的JWT”
为什么我的代码不起作用?
代码:
function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}
// Create token header as a JSON string
$header = json_encode(["alg" => "ES256","typ" => "JWT"]);
// Create token payload as a JSON string
$payload = json_encode(["aud" => "https://fcm.googleapis.com","exp" => time() + 3600,"sub" => "mailto:push@example.com"]);
// Encode Header to Base64Url String
$base64UrlHeader = base64url_encode($header);
// Encode Payload to Base64Url String
$base64UrlPayload = base64url_encode($payload);
// Create Signature Hash
$signature = hash_hmac("SHA256", $base64UrlHeader . "." . $base64UrlPayload, "PRIVATE_KEY", true);
// Encode Signature to Base64Url String
$base64UrlSignature = base64url_encode($signature);
// Create JWT
$token = $base64UrlHeader . "." . $base64UrlPayload . "." . $base64UrlSignature;
$key = "PUBLIC_KEY";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send/.....');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
$headers = array();
$headers[] = "Ttl: 60";
$headers[] = "Content-Length: 0";
$headers[] = "Authorization: vapid t=".$token.",k=".$key."";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
curl_close($ch);
echo json_encode($result);
答案 0 :(得分:0)
在代码中,您使用私钥对令牌进行签名,并使用公钥进行验证,这仅适用于非对称签名算法,例如RS256
。但是,选择HS256
作为签名算法,这是一种对称签名算法。
标头中的alg
声明确定使用哪种算法来验证签名。因此,标头中的算法名称必须与用于签名的算法匹配。
对于对称算法,您必须使用相同的秘密进行签名和验证。秘密只是一个没有特殊形式的字符串,例如。 “我的超级秘密”或更好的东西,例如“ 12z4104cntc4ta9c53434c9032trcbwuer8r”。
现在您可以
HS256
使用一个秘密,而不是公用密钥和私有密钥。RS256
,这将需要更多代码更改,因为现在您要计算HMAC-SHA256(HS256
)哈希。我强烈建议使用JWT库。 a list of libs上有https://jwt.io种语言和环境