Точное воспроизведение результата PHP json_encode в JavaScript / NodeJS

В JavaScript (NodeJS) я пытаюсь проверить происхождение полезной нагрузки с помощью подписи HMAC, созданной с использованием процесса PHP:

$raw_json = '{"link":"https://data.com.sg/resource?2f6b5c55-c8cb-4398-875c-a1c69e0d2706"}';  
$payload = json_decode($raw_json, true);  
$signature = hash_hmac('sha256', json_encode($payload), 'SECRET_KEY');

используя аналогичный процесс JS:

const rawJSON = '{"link":"https://data.com.sg/resource?2f6b5c55-c8cb-4398-875c-a1c69e0d2706"}';
const payload = JSON.parse(rawJSON)
const signature = HMACSHA256(JSON.stringify(payload), 'SECRET_KEY');

Но я обнаружил, что длина JSON.stringify(payload) и json_encode($payload) разная. Регистрируя оба данных, я обнаружил, что это проблема с экранированным символом, возникающая при выполнении json_encode в строке со ссылкой или символом / (или, возможно, любым другим).

JavaScript's JSON.stringify results

{"link":"https://data.com.sg/resource?2f6b5c55-c8cb-4398-875c-a1c69e0d2706"}

PHP's json_encode results

{"link":"https://data.com.sg/resource?2f6b5c55-c8cb-4398-875c-a1c69e0d2706"}

Я не могу изменить процесс на стороне системы PHP. Поэтому мне нужно адаптировать процесс генерации HMAC на стороне системы nodejs.

Что можно сделать, чтобы я мог безупречно воспроизвести json_encode в JavaScript?

Пожалуйста, см. P.S.


P.S.

Я пробовал использовать какой-то модуль json_encode, но он все равно дает тот же результат, что и JSON.stringify.

А пока я решаю эту проблему, добавляя заменитель говорил здесь. Но поскольку мои данные будут заполнены форматированным текстом, Меня беспокоит возможность другого случая различий результатов из-за существования символов, отличных от / char. Или меня это не должно беспокоить?

Вам может показаться интересным ~ json_encode () экранирование косой черты. На мой взгляд, PHP немного усердствует со своими значениями по умолчанию.

Phil 09.04.2018 07:18

нет, у меня нет доступа для редактирования процесса генерации подписи в системе PHP @Phil

shrotavre 09.04.2018 07:22

Блин, как жаль. Тогда я думаю, вы застряли с заменителем. Обратитесь к документации PHP, чтобы узнать, что еще json_encode() делает по умолчанию.

Phil 09.04.2018 07:24

В PHP вы можете использовать флаг JSON_UNESCAPED_SLASHES, и он не будет добавлять косую черту.

4EACH 09.04.2018 08:09
Стоит ли изучать 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 и хотите разрабатывать...
3
4
219
0

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