Кодирование JWT не работает в PHP с Firebase

Я использую «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, который пользователь сможет позже использовать для обхода каталогов.

«Я не уверен, что делаю неправильно». Что неясного в сообщении «Аргумент 3 [...] должен иметь тип строки, задан массив»?

Olivier 15.08.2024 13:46

Если сомневаетесь проверьте документацию или посмотрите код прототипа функции public static function encode( array $payload, $key, string $alg, ?string $keyId = null, ?array $head = null ): string Итак, если вы хотите также включить заголовок, его параметр 5

RiggsFolly 15.08.2024 14:10

Итак, $jwt = JWT::encode($payload, $key, 'HS256', null, $header); выглядит так, как вы хотите

RiggsFolly 15.08.2024 14:12

@RiggsFolly Возможно, $keyId (4-й параметр) соответствует $kid, поэтому последний параметр может вообще не понадобиться.

Olivier 15.08.2024 14:17

@Оливье, возможно ты прав

RiggsFolly 15.08.2024 14:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
73
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

// 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);

Это должно сработать

shirshak007 16.08.2024 09:12

Другие вопросы по теме