Uma biblioteca somente de cabeçalho para criar e validar JSON Web Tokens em C++11. Para uma ótima introdução, leia isto.
O objetivo é fornecer uma coleção versátil e universalmente aplicável de algoritmos, classes e estruturas de dados, promovendo adaptabilidade e integração perfeita com outras bibliotecas que você já esteja utilizando.
jwt-cpp oferece suporte abrangente a todos os algoritmos especificados no padrão. Seu design modular facilita a inclusão perfeita de algoritmos adicionais sem encontrar complicações. Se você deseja contribuir com novos algoritmos, sinta-se à vontade para iniciar uma solicitação pull ou abrir um problema.
Para completar, aqui está uma lista de todos os algoritmos suportados:
HMSC | RSA | ECDSA | PSS | EdDSA |
---|---|---|---|---|
HS256 | RS256 | ES256 | PS256 | Ed25519 |
HS384 | RS384 | ES384 | PS384 | Ed448 |
HS512 | RS512 | ES512 | PS512 | |
ES256K |
As instruções de instalação podem ser encontradas aqui.
Um exemplo simples é decodificar um token e imprimir todas as suas declarações, vamos (experimentar):
# 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;
}
Você pode construir e executar este exemplo localmente após clonar o repositório. Executando alguns comandos, podemos ver o conteúdo da carga JWT
cmake .
cmake --build . --target print-claims
./print-claims
# iss = "auth0"
# sample = "test"
Você notará rapidamente que os JWT não são criptografados, mas sim assinados criptograficamente para fornecer não repúdio.
Para verificar um token, primeiro você constrói um verificador e o usa para verificar um token decodificado.
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);
O verificador não tem estado, portanto você pode reutilizá-lo para diferentes tokens.
Criar o token acima (e assiná-lo) é igualmente fácil.
auto token = jwt::create()
.set_type( " JWS " )
.set_issuer( " auth0 " )
.set_payload_claim( " sample " , jwt::claim(std::string( " test " )))
.sign(jwt::algorithm::hs256{ " secret " });
Se você deseja emitir ou verificar mais tokens exclusivos, confira os exemplos que funcionam com chaves públicas e privadas RSA, tokens de curva elíptica e muito mais!
Com base no objetivo de fornecer flexibilidade.
jwt-cpp suporta OpenSSL, LibreSSL e wolfSSL. Para obter uma lista das versões testadas, verifique esta página para mais detalhes.
Não há dependência estrita de uma biblioteca JSON específica neste contexto. Em vez disso, o jwt-cpp utiliza um jwt::basic_claim
genérico que é modelado com base na característica do tipo. Essa característica fornece os tipos JSON semânticos para valores, objetos, matrizes, strings, números, inteiros e booleanos, juntamente com métodos para traduzir perfeitamente entre eles.
Esse design oferece flexibilidade na escolha da biblioteca JSON que melhor atende às suas necessidades. Para aproveitar uma das características JSON fornecidas, consulte docs/traits.md para obter orientação detalhada.
jwt::basic_claim<my_favorite_json_library_traits> claim (json::object({{ " json " , true },{ " example " , 0 }}));
Para aprender como escrever a implementação de uma característica, confira estas instruções
No que diz respeito às especificações base64 para JWTs, esta biblioteca inclui base.h
abrangendo todas as variantes necessárias. Embora a própria biblioteca ofereça uma implementação proficiente de base64, vale a pena notar que as implementações de base64 estão amplamente disponíveis, exibindo diversos níveis de desempenho. Se preferir usar sua própria implementação base64, você tem a opção de definir JWT_DISABLE_BASE64
para excluir a implementação jwt-cpp.
Se você tiver sugestões de melhorias ou se identificou um bug, não hesite em abrir um problema ou contribuir criando uma solicitação pull. Ao relatar um bug, forneça detalhes abrangentes sobre o seu ambiente, incluindo a versão do compilador e outras informações relevantes, para facilitar a reprodução do problema. Além disso, se você estiver introduzindo um novo recurso, certifique-se de incluir casos de teste correspondentes para validar sua funcionalidade.
Para usar o jwt-cpp você precisa das seguintes ferramentas.
Para construir os casos de teste você também precisa
Consulte as perguntas frequentes para obter dicas.