--- title: Подписать запрос description: Вычислите HMAC по окончательным байтам и храните ключ в Identity. sources: - eazy_sdk.request.hmac_sha256 - eazy_sdk.request.SigningKey - eazy_sdk.request.SigningKeyRequirement - eazy_sdk.request.body_digest - eazy_sdk.request.header_output api_fingerprint: "sha256:d5b2d146f4a67efeaaaf7f15220db08a5f21a39a7e3cb34b2376c46630fd3969" --- Подпись является частью контракта операции, а секретный ключ принадлежит `Identity`. Поэтому вызывающий метод не принимает ключ и не может случайно отправить его как данные запроса. ```{literalinclude} ../../../../../examples/mail/http/send.py :language: python :start-after: "# region docs: http-send-signature" :end-before: "# endregion docs: http-send-signature" ``` `SigningKeyRequirement` называет нужный ключ. `body_digest("sha256")` читает окончательные байты тела, а `header_output(...)` записывает результат в разрешённый заголовок. ```{literalinclude} ../../../../../examples/mail/http/send.py :language: python :start-after: "# region docs: http-send-operations" :end-before: "# endregion docs: http-send-operations" ``` ```{literalinclude} ../../../../../examples/docs/signing.py :language: python :start-after: "# region docs: signing-run" :end-before: "# endregion docs: signing-run" ``` :::{dropdown} Запускаемый файл целиком ```{literalinclude} ../../../../../examples/docs/signing.py :language: python ``` ::: ```text signed message: 100 ``` Runtime сначала строит wire-представление, кодирует и при необходимости шифрует его. Только после этого signer получает неизменяемый prepared request. Retry и redirect готовят и подписывают новую попытку заново. Отсутствующий ключ, неподдерживаемый профиль точных байтов или конфликт двух writers завершают вызов до отправки. Не выводите ключ, основу подписи с секретными полями или готовую подпись в журнал приложения. ## Дальше - {doc}`Зашифровать payload ` - {doc}`Подписать письмо в учебном SDK ` - {doc}`Справочник подписи `