From d3efc643f538f9205dbad5a9122d3daacd21ef34 Mon Sep 17 00:00:00 2001 From: keqingmoe Date: Sun, 22 Dec 2024 16:29:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0JWT=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=8C=E5=8C=85=E6=8B=AC=E5=88=9B=E5=BB=BA=E3=80=81=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=92=8C=E9=AA=8C=E8=AF=81=E4=BB=A4=E7=89=8C=E7=9A=84?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/jwt/jwt.h | 19 ++++++++++++++ include/{kqm => server}/defs.h | 0 include/{kqm => server}/types.h | 6 ++--- src/jwt/jwt.cpp | 46 +++++++++++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 include/jwt/jwt.h rename include/{kqm => server}/defs.h (100%) rename include/{kqm => server}/types.h (73%) create mode 100644 src/jwt/jwt.cpp 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