用於在 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,您需要以下工具。
為了建立測試用例,您還需要
請參閱常見問題以取得提示。