我试图使用PHP-JWT生成JWT,但最终总是得到错误消息:
PHP Warning: openssl_sign(): supplied key param cannot be coerced into a private key
我已经尝试用openssl生成密钥对,使用opennssl用密码保护密钥,然后使用openssl_get_privatekey()
读取密钥,我已经尝试将密钥粘贴到php中的多行字符串中({{1 }}和EOT
分隔符)。然后我尝试在示例页面上复制/粘贴键,仍然出现相同的错误,我在这里遗漏了什么?
不知道这是否可能是一个问题,但是我正在Windows机器上进行开发,然后将其发送到远程服务器,这是Linux机器...
编辑: 我如何生成密钥:
EOD
阅读方式:
openssl genrsa -aes256 -out private.pem 2048
也尝试过: openssl genrsa -out private.pem 2048 阅读:
openssl_get_privatekey('keys/private.pem','0mrY2mX9NeAb0RmpcoeF');
openssl_get_privatekey('file://'.__DIR__.'/keys/private.pem','0mrY2mX9NeAb0RmpcoeF');
还尝试了内联:
file_get_contents('keys/private.pem');
但是我不认为问题出在我如何生成密钥上,因为自述文件上的示例对我不起作用
答案 0 :(得分:3)
似乎您忘记了从私钥中生成(或提取)公钥。
请确保您已完成以下步骤:
1)生成私钥:
openssl genrsa -out private.pem 2048
2)从私钥中提取公钥:
openssl rsa -in private.pem -outform PEM -pubout -out public.pem
3)和示例php代码:
<?php
require_once('vendor/autoload.php');
use \Firebase\JWT\JWT;
$privateKey = file_get_contents('./private.pem');
$publicKey = file_get_contents('./public.pem');
$payload = [
'data' => ['field1' => 1, 'field2' => 'string data'],
"iss" => "http://example.org",
"aud" => "http://example.com",
"iat" => 1531498466,
"eat" => 1557000000
];
$token = JWT::encode($payload, $privateKey, 'RS256');
echo "Token:\n" . print_r($token, true) . "\n";
$decoded = JWT::decode($token, $publicKey, ['RS256']);
$decoded_array = (array) $decoded;
echo "Decoded:\n" . print_r($decoded_array, true) . "\n";
奖励: HS256示例
由于HS256是对称算法,因此不需要私钥/公钥对。
您可以使用自己的类似blablabla的随机秘密字符串,而无需使用生成器等:
<?php
require_once('vendor/autoload.php');
use \Firebase\JWT\JWT;
$secret = 'blablabla-secret-string';
// or You can save that random text in .jwt-secret file and use this way
// $secret = file_get_contents('./.jwt-secret');
$payload = [
'data' => ['field1' => 1, 'field2' => 'string data'],
"iss" => "http://example.org",
"aud" => "http://example.com",
"iat" => 1531498466,
"eat" => 1557000000
];
$token = JWT::encode($payload, $secret, 'HS256');
echo "HS256 Token:\n" . print_r($token, true) . "\n";
$decoded = JWT::decode($token, $secret, ['HS256']);
$decoded_array = (array) $decoded;
echo "HS256 Token decoded:\n" . print_r($decoded_array, true) . "\n";