В 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. Или меня это не должно беспокоить?
нет, у меня нет доступа для редактирования процесса генерации подписи в системе PHP @Phil
Блин, как жаль. Тогда я думаю, вы застряли с заменителем. Обратитесь к документации PHP, чтобы узнать, что еще json_encode() делает по умолчанию.
В PHP вы можете использовать флаг JSON_UNESCAPED_SLASHES, и он не будет добавлять косую черту.






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