Подписанный токен на 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
hmac.new(key, msg, hashlib.sha256).digest().- base64url без
=: при декодировании дополните padding.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Предыдущий вопрос
Аутентификация и авторизация
Следующий вопрос
Проверка прав: роли и владение объектом