Я использую «firebase/php-jwt»: «^6.10» для интеграции JWT и PHP.
// Path to the key file
$key_file = '/var/www/mykey.key';
// Check if the key file exists and read the contents
if (!file_exists($key_file)) {
die('Key file not found.');
}
$key = file_get_contents($key_file); /
$kid = // Hex value of directory path
// JWT Payload
$payload = [
'iss' => 'http://yourdomain.com', // Issuer
'aud' => 'http://yourdomain.com', // Audience
'iat' => time(), // Issued at
'exp' => time() + 3600, // Expiration (1 hour)
'data' => [
'user_id' => $user['id'],
'email' => $user['email'],
'role' => $user['role'],
'is_admin' => $user['isadmin']
]
];
// JWT Header with `kid`
$header = [
'alg' => 'HS256',
'typ' => 'JWT',
'kid' => $kid // Add the `kid` parameter in the header
];
// Encode JWT with header and payload
$jwt = JWT::encode($payload, new Key($key, 'HS256'), $header);
Когда я выполняю код, кажется, что функция кодирования каким-то образом обновляется. Выдает ошибку
Uncaught TypeError: аргумент 3, переданный в Firebase\JWT\JWT::encode(), должен иметь строку типа, заданный массив, вызываемый в /var/www/html/index.php
В принципе, в этой строке
$jwt = JWT::encode($payload, new Key($key, 'HS256'), $header);
Я не уверен, что я делаю неправильно. Я хочу добавить в свой заголовок параметр kid, который пользователь сможет позже использовать для обхода каталогов.
Если сомневаетесь проверьте документацию или посмотрите код прототипа функции public static function encode( array $payload, $key, string $alg, ?string $keyId = null, ?array $head = null ): string Итак, если вы хотите также включить заголовок, его параметр 5
Итак, $jwt = JWT::encode($payload, $key, 'HS256', null, $header); выглядит так, как вы хотите
@RiggsFolly Возможно, $keyId (4-й параметр) соответствует $kid, поэтому последний параметр может вообще не понадобиться.
@Оливье, возможно ты прав






// Encode JWT with header and payload
$jwt = JWT::encode($payload, new Key($key, 'HS256'), $header['alg']);
Как сказал @RiggsFolly, если вы хотите использовать массив заголовков, вам нужно, чтобы для 4-го параметра было установлено значение null, и используйте переменную заголовков в качестве 5-го параметра.
Документацию для этого можно найти в README пакета: https://github.com/firebase/php-jwt?tab=readme-ov-file#example-encodedecode-headers
Итак, в этом случае должно быть:
$jwt = JWT::encode($payload, $key, 'HS256', null, $header);
Это должно сработать
«Я не уверен, что делаю неправильно». Что неясного в сообщении «Аргумент 3 [...] должен иметь тип строки, задан массив»?