diff --git a/include/jwt/jwt.h b/include/jwt/jwt.h new file mode 100644 index 0000000..657b141 --- /dev/null +++ b/include/jwt/jwt.h @@ -0,0 +1,19 @@ +#ifndef JWT_H +#define JWT_H + +#ifdef __cplusplus +extern "C" +{ +#endif + + char* create_token(const char* user, const char* secret); + + char* get_payload(const char* token); + + int verify_token(const char* token, const char* secret); + +#ifdef __cplusplus +} +#endif + +#endif // JWT_H diff --git a/include/kqm/defs.h b/include/server/defs.h similarity index 100% rename from include/kqm/defs.h rename to include/server/defs.h diff --git a/include/kqm/types.h b/include/server/types.h similarity index 73% rename from include/kqm/types.h rename to include/server/types.h index ddcfe3d..5a48fb3 100644 --- a/include/kqm/types.h +++ b/include/server/types.h @@ -1,5 +1,5 @@ -#ifndef KQM_TYPES_H -#define KQM_TYPES_H +#ifndef SERVER_TYPES_H +#define SERVER_TYPES_H #include @@ -8,4 +8,4 @@ typedef struct mg_context mg_context; typedef struct mg_connection mg_connection; typedef struct mg_request_info mg_request_info; -#endif // KQM_TYPES_H +#endif // SERVER_TYPES_H diff --git a/src/jwt/jwt.cpp b/src/jwt/jwt.cpp new file mode 100644 index 0000000..788e621 --- /dev/null +++ b/src/jwt/jwt.cpp @@ -0,0 +1,46 @@ +#include "jwt.h" + +#include +#include + + +using namespace std::literals::chrono_literals; + +extern "C" +{ + char* create_token(const char* user_id, const char* secret) + { + 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() + 3s) + .set_payload_claim("user_id", jwt::claim(std::string{user_id})) + .sign(jwt::algorithm::hs256{secret}); + return strdup(token.c_str()); + } + + char* get_payload(const char* token) + { + auto decoded_token = jwt::decode(token); + auto payload = decoded_token.get_payload_claim("user_id").as_string(); + return strdup(payload.c_str()); + } + + int verify_token(const char* token, const char* secret) + { + 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; + } + } +} \ No newline at end of file