Я пытаюсь реализовать библиотеку Facebook с помощью node.js, и подпись запроса не работает.У меня есть пример PHP , показанный здесь , переведенный в узел.Я пробую это с примером, приведенным там, где секрет - это строка «секрет».Мой код выглядит так:
var signedRequest = request.signed_request.split('.');
var sig = b64url.decode(signedRequest[0]);
var expected = crypto.createHmac('sha256', 'secret').update(signedRequest[1]).digest();
console.log(sig == expected); // false
Я не могу console.log
сами декодированные строки, потому что у них есть специальные символы, которые заставляют консоль очищаться (если у вас есть предложение обойти это, пожалуйста,я знаю) но я могу вывести их кодировку b64url.
Ожидаемый кодированный sig, как вы можете видеть в документации FB, равен
vlXgu64BQGFSQrY0ZcJBZASMvYvTHu9GQ0YM9rjPSso
My expected
, когдазакодировано, это
wr5Vw6DCu8KuAUBhUkLCtjRlw4JBZATCjMK9wovDkx7Dr0ZDRgzDtsK4w49Kw4o
Так почему я думаю, что это digest
, что это неправильно?Может ошибка на моей стороне?Что ж, если я выполню точный пример в PHP, приведенный в документации, получится правильный результат.Но если я изменю вызов hash_hmac
, чтобы последний параметр был ложным, выводя hex, я получу
YmU1NWUwYmJhZTAxNDA2MTUyNDJiNjM0NjVjMjQxNjQwNDhjYmQ4YmQzMWVlZjQ2NDM0NjBjZjZiOGNmNGFjYQ==
Теперь, если я вернусь к своему JavaScript-коду и изменим свой код HMAC на .digest("hex")
вместо значения по умолчанию "binary"
и записи в кодировке результата base64, я получаю ... сюрприз!
YmU1NWUwYmJhZTAxNDA2MTUyNDJiNjM0NjVjMjQxNjQwNDhjYmQ4YmQzMWVlZjQ2NDM0NjBjZjZiOGNmNGFjYQ
То же самое, за исключением того, что знаки == отсутствуют с конца, но я думаю, что этоконсольная вещь.Я не могу себе представить, что это проблема, без них это даже не допустимая длина строки base64.
Итак, почему метод дайджеста выводит правильный результат при использовании hex, но неправильный ответ при использовании двоичного?Разве двоичный файл не совсем совпадает с «необработанным» выводом эквивалента PHP?И если это так, как это правильно назвать?