为什么我收到PHP无效的JWT提供的错误?

时间:2019-09-16 19:34:45

标签: php jwt push

从以下项生成的密钥: https://web-push-codelab.glitch.me/

响应已通过以下验证:https://jwt.io/ enter image description here

返回的令牌有效!但我在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);

1 个答案:

答案 0 :(得分:0)

在代码中,您使用私钥对令牌进行签名,并使用公钥进行验证,这仅适用于非对称签名算法,例如RS256。但是,选择HS256作为签名算法,这是一种对称签名算法。

标头中的alg声明确定使用哪种算法来验证签名。因此,标头中的算法名称必须与用于签名的算法匹配。

对于对称算法,您必须使用相同的秘密进行签名和验证。秘密只是一个没有特殊形式的字符串,例如。 “我的超级秘密”或更好的东西,例如“ 12z4104cntc4ta9c53434c9032trcbwuer8r”。

现在您可以

  • HS256使用一个秘密,而不是公用密钥和私有密钥。
  • 将算法更改为RS256,这将需要更多代码更改,因为现在您要计算HMAC-SHA256(HS256)哈希。

我强烈建议使用JWT库。 a list of libs上有https://jwt.io种语言和环境