用于在 C++11 中创建和验证 JSON Web 令牌的仅标头库。如需精彩介绍,请阅读本文。
目标是提供通用且普遍适用的算法、类和数据结构集合,促进适应性以及与您可能已经使用的其他库的无缝集成。
jwt-cpp全面支持标准中指定的所有算法。其模块化设计有助于无缝包含其他算法,而不会遇到任何复杂情况。如果您希望贡献新算法,请随时发起拉取请求或提出问题。
为了完整起见,以下是所有支持的算法的列表:
骨髓间充质干细胞 | RSA | 电子CDSA | PSS | 埃德DSA |
---|---|---|---|---|
HS256 | RS256 | ES256 | PS256 | 埃德25519 |
HS384 | RS384 | ES384 | PS384 | 埃德448 |
HS512 | RS512 | ES512 | PS512 | |
ES256K |
您可以在此处找到安装说明。
一个简单的例子是解码一个令牌并打印它的所有声明让我们(尝试一下):
# 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 }}));
要了解如何编写特征的实现,请查看这些说明
关于 JWT 的 base64 规范,该库包括包含所有必要变体的base.h
虽然该库本身提供了熟练的 base64 实现,但值得注意的是,base64 实现广泛可用,表现出不同的性能水平。如果您更喜欢使用自己的 base64 实现,则可以选择定义JWT_DISABLE_BASE64
以排除 jwt-cpp 实现。
如果您有改进建议或者发现了错误,请随时提出问题或通过创建拉取请求做出贡献。报告错误时,请提供有关您的环境的全面详细信息,包括编译器版本和其他相关信息,以方便问题重现。此外,如果您要引入新功能,请确保包含相应的测试用例来验证其功能。
为了使用 jwt-cpp,您需要以下工具。
为了构建测试用例,您还需要
请参阅常见问题解答以获取提示。