2015-06-25 1 views
0

Я использую настраиваемый PHP-скрипт для отправки запросов в API mturk на основе функций подписи от the PHP-AWS library. Вот пример запроса:mturk API дает сообщение «указанные претензии недействительными» около половины времени; resubmitting randomly fixes

https://mechanicalturk.amazonaws.com/?Service=AWSMechanicalTurkRequester&AWSAccessKeyId=MYKEY&Version=2012-03-25&Operation=NotifyWorkers&Signature=j+4UTX9x3EKltvWpoxIkp4BM6S4=&Timestamp=2015-06-25T09:37:51Z&Subject=test&MessageText=just+testing+&WorkerId.1=SOMEID

Иногда данный сценарий будет работать, а в другой раз тот же сценарий возвращает ошибку, как это:

AWS.BadClaimsSupplied The specified claims are invalid. Based on your request, your signature should be generated using the following string: AWSMechanicalTurkRequesterNotifyWorkers2015-06-25T09:37:51Z. Check to make sure your system clock and timezone is not incorrect. Our current system time: 2015-06-25T09:37:51Z. (1435225071849)

Когда я получаю AWS.BadClaimsSupplied ошибка, неоднократно повторяющаяся сценарий, заставит ее в конечном итоге работать. Под «work» я подразумеваю, что либо API возвращает true, и предпринимает требуемое действие, либо возвращает ошибку, относящуюся к действию, которое я запрашиваю.

Я предполагаю, что если бы я выполнял хэш неправильно или с неправильной подписью, тогда он никогда не работал *. Периодический характер проблемы заставляет меня думать, что это временная ошибка. Но приведенный выше пример показывает сообщение об ошибке, в котором время, которое я использовал для моей подписи, совпадает с временем, так что это тоже не похоже на проблему.

* хорошо, он будет работать один раз в каждых 2^160 попытках.

Я попытался отсрочить свои временные метки на 1 секунду на всякий случай, когда я был немного впереди них; что не изменило результаты. Я не могу придумать другого способа отладить это.

+0

У вас будет прерывистый успех, существенно превышающий 1/2^160 того времени, если вы не указали urlescape/urlencode свою подпись или кодировали ее «в основном» правильно ... особенно так, как вы обрабатываете любые '+' появляется в нем. Помогает ли это? http://stackoverflow.com/a/17825022/1695906 –

+0

Ohhhhhhhhh, теперь я понимаю. Спасибо! Вы хотите написать это как ответ? – octern

ответ

1

Сообщение об ошибке звучит так, как будто проблема связана с тем, что строка хеширована, но проблема в том, что некоторые хешированные строки включают специальные символы. Символы +, / и = влияют на то, как URL-адрес анализируется и будет мешать чтению вашей подписи. Перезапуск запроса с другой строкой времени будет случайным образом возвращать хэш без этих символов, что позволяет запросу работать.

Решение: Просто запустите urlencode() на подпись перед вызовом API. Если по какой-то причине вы не хотите этого делать, this answer предоставляет код, который кодирует только эти конкретные символы, но я считаю, что стандартная функция более полная и безопасная.

Смежные вопросы