Библиотека только для заголовков для создания и проверки веб-токенов JSON на C++11. Для отличного введения прочитайте это.
Цель состоит в том, чтобы предоставить универсальную и универсально применимую коллекцию алгоритмов, классов и структур данных, способствующую адаптивности и плавной интеграции с другими библиотеками, которые вы, возможно, уже используете.
jwt-cpp полностью поддерживает все алгоритмы, указанные в стандарте. Его модульная конструкция облегчает плавное включение дополнительных алгоритмов без каких-либо сложностей. Если вы хотите внести свой вклад в новые алгоритмы, не стесняйтесь инициировать запрос на включение или открыть проблему.
Для полноты вот список всех поддерживаемых алгоритмов:
HMSC | ЮАР | ECDSA | ПСС | ЭдДСА |
---|---|---|---|---|
ХС256 | RS256 | ES256 | ПС256 | Эд25519 |
ХС384 | RS384 | ES384 | ПС384 | Эд448 |
ХС512 | RS512 | ES512 | ПС512 | |
ЭС256К |
Инструкции по установке можно найти здесь.
Простой пример — декодирование токена и печать всех его утверждений (попробуйте):
# include < jwt-cpp/jwt.h >
# include < iostream >
int main () {
std::string token = " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCIsInNhbXBsZSI6InRlc3QifQ.lQm3N2bVlqt2-1L-FsOjtR6uE-L4E9zJutMWKIe1v1M " ;
auto decoded = jwt::decode (token);
for ( auto & e : decoded. get_payload_json ())
std::cout << e. first << " = " << e. second << std::endl;
}
Вы можете собрать и запустить этот пример локально после клонирования репозитория. Выполнив некоторые команды, мы можем увидеть содержимое полезной нагрузки JWT.
cmake .
cmake --build . --target print-claims
./print-claims
# iss = "auth0"
# sample = "test"
Вы очень быстро заметите, что JWT не зашифрованы, а имеют криптографическую подпись, обеспечивающую невозможность отказа от авторизации.
Чтобы проверить токен, вы сначала создаете верификатор и используете его для проверки декодированного токена.
auto verifier = jwt::verify()
.with_issuer( " auth0 " )
.with_claim( " sample " , jwt::claim(std::string( " test " )))
.allow_algorithm(jwt::algorithm::hs256{ " secret " });
verifier.verify(decoded_token);
Верификатор не имеет состояния, поэтому его можно повторно использовать для разных токенов.
Создать токен выше (и подписать его) так же просто.
auto token = jwt::create()
.set_type( " JWS " )
.set_issuer( " auth0 " )
.set_payload_claim( " sample " , jwt::claim(std::string( " test " )))
.sign(jwt::algorithm::hs256{ " secret " });
Если вы хотите выпустить или проверить больше уникальных токенов, ознакомьтесь с примерами работы с открытыми и закрытыми ключами RSA, токенами с эллиптической кривой и многим другим!
Основываясь на цели обеспечения гибкости.
jwt-cpp поддерживает OpenSSL, LibreSSL и wolfSSL. Список протестированных версий можно найти на этой странице для получения более подробной информации.
В этом контексте нет строгой зависимости от конкретной библиотеки JSON. Вместо этого jwt-cpp использует общий jwt::basic_claim
, шаблон которого основан на признаке типа. Эта черта предоставляет семантические типы JSON для значений, объектов, массивов, строк, чисел, целых чисел и логических значений, а также методы для плавного преобразования между ними.
Этот дизайн обеспечивает гибкость в выборе библиотеки JSON, которая лучше всего соответствует вашим потребностям. Чтобы использовать одну из предоставленных характеристик JSON, обратитесь к docs/traits.md за подробными инструкциями.
jwt::basic_claim<my_favorite_json_library_traits> claim (json::object({{ " json " , true },{ " example " , 0 }}));
Чтобы узнать, как написать реализацию типажа, ознакомьтесь с этими инструкциями.
Что касается спецификаций base64 для JWT, эта библиотека включает в себя base.h
охватывающий все необходимые варианты. Хотя сама библиотека предлагает качественную реализацию base64, стоит отметить, что реализации base64 широко доступны и демонстрируют различные уровни производительности. Если вы предпочитаете использовать собственную реализацию base64, у вас есть возможность определить JWT_DISABLE_BASE64
, чтобы исключить реализацию jwt-cpp.
Если у вас есть предложения по улучшению или вы обнаружили ошибку, не стесняйтесь открыть проблему или внести свой вклад, создав запрос на включение. Сообщая об ошибке, предоставьте подробные сведения о вашей среде, включая версию компилятора и другую соответствующую информацию, чтобы облегчить воспроизведение проблемы. Кроме того, если вы представляете новую функцию, убедитесь, что вы включили соответствующие тестовые примеры для проверки ее функциональности.
Чтобы использовать jwt-cpp, вам потребуются следующие инструменты.
Для создания тестовых случаев вам также понадобится
Советы смотрите в разделе Часто задаваемые вопросы.