Я пытаюсь поработать с клиентом Duo's Python (https://github.com/duosecurity/duo_client_python), и я считаю, что я просто что -то упускаю с моими начинающими глазами Python. Мне каким -то образом нужно аутентифицировать свои запросы в API, используя сигнатуру HMAC, с которой я не работал раньше, но кажется тривиальным для генерации (они даже обеспечивают функцию Python). Док здесь https://duo.com/docs/adminapi#authentication
Я в потере относительно того, как создать эту подпись для аутентификации, перед передачей моей запрос в API. От https://duo.com/docs/adminapi#authentication:
API использует базовую аутентификацию HTTP для аутентификации запросов. Используйте ключ интеграции приложения Duo Duo в качестве имени пользователя HTTP. Это будет> отличаться для каждого запроса и должно быть повторно сгенерировано каждый раз. Чтобы подпись HMAC была генерирована правильно. Я понимаю эту часть. Моя проблема заключается в том, как и когда передать подпись HMAC, которую я генерирую. Поскольку Duo Doc конкретно не вдается в это, я думаю, что это то, что я уже должен знать [не так ли я не новичок в питоне]. < /P>
Пример, простые вызовы авторов работают нормально (так как они не нуждаются в аутентификации): < /p>
root@box: ~# python -m duo_client.client -iky xxxxxxxx -skey xxxxxxxx -Хост xxxxxxxxx.duosecurity.com. >,
"stat": "ok"
} < /pre>
Однако вызовы с использованием администратора требуют аутентификации, и, следовательно, сбой с: < /p>
root@box: ~# python -m duo_client.client -kiney xxxxxxxx -skey xxxxxxxx -host xxxxxxxx.duosecurity.com -method get --path /admin /v1 /пользователи Signature = XXXXXXXX
401 unathorized
{
«код»: 40103,
«Сообщение»: «Неверная подпись в учетных данных запроса»,
stat »::« "Fail"
} < /pre>
< /p>
Поэтому я подумал, что опубликую функцию, которую дуэт обеспечивает для создания подписи, которая похоже на то, что происходит в вопросе Stackoverflow, который, как я думал, может помочь (Python, Https получается с основной аутентификацией). От https://duo.com/docs/adminapi#authentication:
def Знак (метод, хост, путь, параметры, Skey, ikey):
"" ""
return http базовая аутентификация ("Авторизация" и "дата") заголовки.
Метод, хост, путь: строки из запроса
params: dict of aeprer paraters skey: секретный ключ
ikey: key интеграции
"" "
# Создать каноническую строку
now = email.utils.formatdate ()
canon = [теперь, method.upper (), host.lower (), path]
args = []
для ключа в сортировке (params.keys ()):
val = Params [key]
if iSinstance (val, unicode):
val = val.encode ("utf-8")
args.append (
'%s =%s ' % (urllib.quote (key,' ~ '), urllib.quote (val,' ~ ')))
canon.append (' & '. join (args))
canon =' \ n'.join (canon)
# sign canonical string
sig = hmac.new (skey, canon, hashlib.sha1)
auth = '%s:%s:%s ' % (ikey, sig.hexdigest ())
# return cheders
return {' date ': теперь, «авторизация»:' basic % s ' % base64.b64encode (auth) }
< /pre>
Я использовал вышеуказанную функцию в простом сценарии для распечатки (просто чтобы я мог визуализировать), что должно быть передано в сценарии I LL создать на сервере наши потребности - я добавил функцию в скрипт и использовал печати, добавив следующее: < /p>
#Печать заголовки подписи ### Тестирование ###
print sign ('get', 'xxxhostxxx', '/admin/v1/users', 'xxxparamxxx', 'xxxskeyxxx', 'xxxikeyyxxxx')
Однако я получаю эту ошибку: < /p>
root@box: ~# ./duo.py
Traceback (последний вызов последним):
file "./duo.py", строка 39, в
print sign ('get', 'xxxhostxxx', '/admin/v1/users' , 'Xxxparamxxx', 'xxxskeyxxx', 'xxxikeyxxx')
file "./duo.py", строка 18, в знаке
для ключа в сортировке (params.keys ()):
AttributeError: 'str' Object не имеет атрибута 'Keys'
< /pre>
Я просто что -то здесь упускаю? Я искал то, что может вызвать эту ошибку, но я подумал, что спрошу здесь.
Подробнее здесь: https://stackoverflow.com/questions/443 ... hon-client
Duo Security API с клиентом Python ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение