В чем причина некорректного формирования response?
Сделал согласно описанию (ниже) авторизацию на сайте. Но получаю ошибку что неверно указан response
.
В чем может быть причина?
Процедура получения заголовка на python
:
import hashlib
import base64
import datetime
import time
import requests
def generate_digest(username, password, method, rel_uri, realm):
# Get current time and nonce
now = datetime.datetime.now(datetime.timezone.utc)
nonce = base64.b64encode(now.strftime('%a, %d %b %Y %H:%M:%S GMT').encode('ascii')).decode('ascii')
print (nonce)
ha1_str = f"{username}:{realm}:{password}"
ha1_bytes = ha1_str.encode('utf-8')
ha1 = hashlib.sha256(ha1_bytes).hexdigest()
# Calculate HA2
ha2_str = f"{method}:{rel_uri}"
ha2_bytes = ha2_str.encode('utf-8')
ha2 = hashlib.sha256(ha2_bytes).hexdigest()
# Calculate response
response_str = f"{ha1}:{nonce}:{ha2}"
response_bytes = response_str.encode('utf-8')
response = hashlib.sha256(response_bytes).hexdigest()
# Check if the request is still valid
diff = time.mktime(now.timetuple()) - time.mktime(
datetime.datetime.strptime(now.strftime('%a, %d %b %Y %H:%M:%S GMT'), '%a, %d %b %Y %H:%M:%S GMT').timetuple())
if diff > 300:
print("Request is not valid: nonce is too old")
else:
# Return authorization header
return f'Digest username={username}, realm={realm}, nonce={nonce}, algorithm=SHA-256, response={response}'
Описание алгоритма:
Для авторизации используется Digest схема, где nonce представляется стандартной строкой, содержащей дату и время генерации запроса (пример "Fri, 27 Sep 2019 17:15:00 GMT").
Формат дат: Даты должны обязательно быть в формате IMF-fixdate, согласно RFC 7231 Nonce в вычислениях Дата преобразовывается в Base-64 строку, согласно RFC 7616
Действительность запросов: Запрос считается недействительным, если между моментом приема сообщения (серверным временем) и моментом генерации сообщения (указанным в nonce) разница более 5 минут.
За имлементацию Digest
следует принять последний RFC 7616
, где:
HA1 = SHA256("{username}:{realm}:{password}")
HA2 = SHA256("{method}:{rel-uri}")
nonce=base64(current date)
response = SHA256("{HA1}:{nonce}:{HA2}")