2015-05-20 4 views
1

У меня возникли проблемы, порождающие «правильная» строка аутентификации для использования при отправки сообщения Pusher через завитокКак создать строку аутентификации Pusher из Bash?

Вот мой сценарий, секретные биты вырезанных конечно:

#!/bin/bash 

key="my_key" 
secret="my_secret" 
appID="my_app_id" 

timestamp=`date +%s` 
data='{"name":"say_stuff","channel":"test","data":"{\"message\":\"oh_yeah\"}"}' 
md5data=`echo "$data" | md5` 
authSig=`echo 'POST\n/apps/"$appID"/events\nauth_key="$key"&auth_timestamp="$timestamp"&auth_version=1.0&body_md5="$md5data"' | openssl dgst -sha256 -hex -hmac "$secret"` 

curl -H "Content-Type:application/json" -d "$data" "http://api.pusherapp.com/apps/$appID/events?body_md5=$md5data&auth_version=1.0&auth_key=$key&auth_timestamp=$timestamp&auth_signature=$authSig" 

authSig конечно порождена, и выглядит как действительный HmacSHA256Hex

Однако, когда он запускает завиток команду, я получаю такой ответ:

Invalid signature: you should have sent HmacSHA256Hex("POST\n/apps/$appID/events\nauth_key=$key&auth_timestamp=1432086733&auth_version=1.0&body_md5=e5997a811232ffae050be74242254ceb", your_secret_key), but you sent "55029a5e2d1058b352b5c22709e7fb9cb0c6f147846ed09dbc6bcaf6a7a804c7" 

Возможно ли, что утилита openssl на моей машине (Mac OS X 10.10) чем-то отличается от того, что у Pusher?

Вот что-то смешное, что я заметил сейчас. Если вы идете здесь:

https://pusher.com/docs/rest_api

и прокрутите вниз до «Практический пример аутентификации» вы будете в состоянии следовать вместе с примером.

Я попытался создания подписи, используя пример, запустив:

echo 'POST\n/apps/3/events\nauth_key=278d425bdf160c739803&auth_timestamp=1353088179&auth_version=1.0&body_md5=ec365a775a4cd0599faeb73354201b6f' | openssl dgst -sha256 -hex -hmac 7ad3773142a6692b25b8 

и я получаю

aa368756587116f3997427fe1b315ed0e2f2faa555066e565a25cfe6f47c9396 

в противоположность их примеру, что приводит к

da454824c97ba181a32ccc17a72625ba02771f50b50e1e7430e47a1f3f457e6c 
+0

Это может или не может быть причиной ваших проблем, но вы должны _double-quote_ все ссылки на переменные, чтобы защитить их от непреднамеренного расширений оболочки (интерпретацию оболочка); '' $ data "', а не '$ data',' "$ secret" 'вместо' $ secret', ... – mklement0

+0

Пробовал, что же проблема ... –

+0

Есть, добавьте двойные кавычки к своему вопросу, чтобы не создавать отвлекающие факторы. – mklement0

ответ

2

Try следующие:

#!/bin/bash 

key="my_key" 
secret="my_secret" 
appID="my_app_id" 

timestamp=$(date +%s) 
data='{"name":"say_stuff","channel":"test","data":"{\"message\":\"oh_yeah\"}"}' 
# Be sure to use `printf %s` to prevent a trailing \n from being added to the data. 
md5data=$(printf '%s' "$data" | md5) 

path="/apps/${appID}/events" 
queryString="auth_key=${key}&auth_timestamp=${timestamp}&auth_version=1.0&body_md5=${md5data}" 

# Be sure to use a multi-line, double quoted string that doesn't end in \n as 
# input for the SHA-256 HMAC. 
authSig=$(printf '%s' "POST 
$path 
$queryString" | openssl dgst -sha256 -hex -hmac "$secret") 

curl -H "Content-Type:application/json" -d "$data" "http://api.pusherapp.com${path}?${queryString}&auth_signature=${authSig}" 

Были некоторые проблемы с вашим кодом:

  • Используя echo вы приложили завершающую строку на вход подается в md5 и openssl, которые изменили данные.
  • В \n последовательности в строке, чтобы перейти к openssl предназначены для представления фактических новой строки, в то время как вы использовали их в качестве литералов.

Кроме того, я дублированный код, используемый ${name} ссылка на переменной (имена, заключенные в фигурных скобках) для лучшей наглядности, и я также установил проблемы двойных кавычек.


Что касается образца хэша с сайта: опять же, ваши проблемы были с помощью echo и не расширяющейся встроенных \n последовательностей в фактические символы новой строки; следующая команда оболочки делает дает правильный результат:

# Expand the '\n' sequences to newlines using an ANSI C-quoted string 
# ($'...') 
s=$'POST\n/apps/3/events\nauth_key=278d425bdf160c739803&auth_timestamp=1353088179&auth_version=1.0&body_md5=ec365a775a4cd0599faeb73354201b6f' 
# Pass to openssl using `printf %s`. 
printf %s "$s" | openssl dgst -sha256 -hex -hmac 7ad3773142a6692b25b8 
+1

Все отлично работает! Спасибо за вашу помощь! –

+0

Я рад это слышать; Обработка строк в оболочке - сложный бизнес. – mklement0

+0

У меня такой же вопрос для VBscript, если вам интересно: http://stackoverflow.com/questions/38962360/how-to-generate-pusher-authentication-string-from-vbscript –