math/src/jwt/jwt.cpp

52 lines
1.5 KiB
C++

#include "jwt.h"
#include <chrono>
#include <print>
#include <jwt-cpp/jwt.h>
using namespace std::literals::chrono_literals;
extern "C"
{
auto create_token(const char* user_id, const char* secret) -> char*
{
auto token = jwt::create()
.set_type("JWS")
.set_issuer("KeqingMoe")
.set_subject("user_id")
.set_audience("web_client")
.set_expires_at(std::chrono::system_clock::now() + 1h)
.set_payload_claim("user_id", jwt::claim(std::string{user_id}))
.sign(jwt::algorithm::hs256{secret});
return strdup(token.c_str());
}
auto get_payload(const char* token) -> char*
{
try {
auto decoded_token = jwt::decode(token);
auto payload = decoded_token.get_payload_claim("user_id").as_string();
return strdup(payload.c_str());
} catch (...) {
return nullptr;
}
}
auto verify_token(const char* token, const char* secret) -> int
{
try {
auto decoded_token = jwt::decode(token);
auto verifier = jwt::verify()
.allow_algorithm(jwt::algorithm::hs256{secret})
.with_issuer("KeqingMoe")
.with_subject("user_id");
verifier.verify(decoded_token);
return 1;
} catch (...) {
return 0;
}
}
}