52 lines
1.5 KiB
C++
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;
|
|
}
|
|
}
|
|
} |