Обновление Facebook в режиме реального времени: проверка подписи X-Hub-Signature SHA1 в Java

Когда Facebook отправляет обновления в режиме реального времени, они включают X-Hub-Signature в заголовок HTTP. Согласно их документации, они используют SHA1 и секрет приложения в качестве ключа.

На основе похожего вопроса для С# я попытался проверить подпись следующим образом («тело» — это сообщение, отправленное facebook в теле запроса):

String passedSignature = req.getHeader("X-Hub-Signature").substring(5);
Mac hmac = Mac.getInstance("HmacSHA1");
hmac.init(new SecretKeySpec(FACEBOOK_SECRET.getBytes(Charset.forName("UTF-8")), "HmacSHA1"));
String calculatedSignature = Hex.encodeHexString(hmac.doFinal(body.getBytes(Charset.forName("UTF-8"))));
logger.debug("Calculated sigSHA1: " + calculatedSignature + " passedSignature: " + passedSignature);

Но переданная подпись всегда отличается от вычисляемой подписи.

Кто-нибудь может помочь решить проблему?


person Alessandro Polverini    schedule 20.06.2013    source источник
comment
Вам не нужно определять Charset.forName("UTF-8"), так как секрет FB использует только символы Latin1 (ISO8859-1).   -  person jbrios777    schedule 31.08.2016


Ответы (1)


Оказывается, код правильный, я использовал не тот ключ :-/

В любом случае, я надеюсь, что это может помочь кому-то еще.

person Alessandro Polverini    schedule 21.06.2013
comment
Да, я тоже! :-( Следует использовать токен секрета приложения, а не токен проверки ('hub.verify_token'), используемый в запросе проверки. - person Uhlen; 06.11.2018