最近做项目遇到一个问题,需要用jwt实现token的验证。首先到jwt的官网https://jwt.io/#libraries查看jwt支持哪些开源库。由于我用的是C++开发的项目,通过比较各个C++开源库,所以最终采用https://github.com/Thalhammer/jwt-cpp这个开源库实现基于jwt的token验证。采用该开源库主要是因为:1、该开源库支持所有的加密算法,可以参考官网;2、该开源库使用方便。

下面我介绍一下该开源库的使用:

1、该开源库依赖openssl,所以如果你是在win平台编译的程序你可能需要首先安装openssl,至于win下如何安装openssl可以百度,这里不再详细介绍;同时该开源库依赖于C++11,所以win平台下可能需要采用vs2015及以上;

2、不需要编译生成.lib、.dll以及.so文件,使用的时候直接include"base.h    jwt.h    picojson.h"这三个头文件即可。

下面我介绍一下该开源库的主要接口,方便大家使用。直接上程序:

#include "jwt-cpp/base.h"
#include "jwt-cpp/jwt.h"
#include "jwt-cpp/picojson.h"
#include "iostream"
using namespace std;
int main(int argc, const char** argv) {
	std::string token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXUyJ9.eyJpc3MiOiJhdXRoMCJ9.AbIJTDMFc7yUa5MhvcP03nJPyCPzZtQcGEp-zWfOkEE";
	auto decoded = jwt::decode(token);
	//Get all payload claims
	for (auto&e1:decoded.get_payload_claims())
		std::cout << e1.first << " = " << e1.second.to_json() << std::endl;
	//Get all header claims
	for (auto&e2:decoded.get_header_claims())
		std::cout << e2.first << " = " << e2.second.to_json() << std::endl;
	//Create a verifier using the default clock then return verifier instance
	/* allow_algorithm()
		  Add an algorithm available for checking.
		  param alg Algorithm to allow
		  return *this to allow chaining*/
	auto verifier = jwt::verify().allow_algorithm(jwt::algorithm::hs256{"secret"}).with_issuer("auth0");
	bool ok = verifier.verify(decoded);
	printf("ok = %d\n", ok);
    auto token_1 = jwt::create()
		.set_issuer("auth0")
		.set_type("JWS")
		.set_payload_claim("sample", std::string("test"))
		.sign(jwt::algorithm::hs256{ "secret" });
		printf("token_1 = %s\n", token_1);
}

decode()函数:对你的token进行解码;

get_payload_claims():获取jwt的payload的所有声明,利用std::cout << e1.first << " = " << e1.second.to_json() << std::endl;这句话可以打印输出jwt的负载部分;

get_header_claims():获取jwt的header的所有声明,并同时可以打印输出jwt的头部;

jwt::verify().allow_algorithm(jwt::algorithm::hs256{"secret"}).with_issuer("auth0"):声明一个解码器,利用该解码器可以对你的token值进行验证,hs256是你采用的加密算法,“secret”是你的密钥,这里可以根据自己的实际需求进行更改;

verifier.verify():验证你的token值是否正确。这里我根据自己的实际情况对github上面的开源库做了略微的修改,使其实现:如果token正确的话返回true,token错误返回false;

jwt::create():生成一个token;同时你可以设置token的过期时间,上述程序没有设置token的过期时间。

以上就是主要用到的一些接口的详细介绍。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐