Код Middle Аутентификация и права спрашивают часто обновлено

Подписанный токен на hmac

Условие

Реализуйте мини-JWT без внешних библиотек. sign(payload, secret) возвращает строку base64url(json).base64url(hmac_sha256), где JSON с отсортированными ключами и без пробелов (separators=(",", ":")), base64url без =. verify(token, secret, now) возвращает payload, если подпись верна (сравнение через hmac.compare_digest) и now < payload["exp"]; иначе строку "bad_signature", "expired" или "malformed" (если формат не a.b или JSON не читается). Проверка run(payload, secret, verify_secret, now, tamper) подписывает, при tamper подменяет поле role на admin в payload-части без переподписи и проверяет.

Примеры

run({"sub":"42","role":"user","exp":1000}, "k", "k", 500, false) // {"sub":"42","role":"user","exp":1000}
run({"sub":"42","role":"user","exp":1000}, "k", "k", 1000, false) // "expired"
run({"sub":"42","role":"user","exp":1000}, "k", "other", 500, false) // "bad_signature"

Как подойти

Подсказки: 2
  1. hmac.new(key, msg, hashlib.sha256).digest().
  2. base64url без =: при декодировании дополните padding.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.

Термины по теме