From f113ae6cbaf741f9531f1440e432ffd9139fe2cf Mon Sep 17 00:00:00 2001 From: LittleSheep <littlesheep.code@hotmail.com> Date: Sat, 29 Mar 2025 15:21:30 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20User=20info=20DirectAccess?= =?UTF-8?q?=E2=84=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/internal/auth/userinfo.go | 15 +++++++++++++++ pkg/internal/cache/redis.go | 16 ++++++++++++++-- pkg/nex/cachekit/direct_const.go | 13 +++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 pkg/nex/cachekit/direct_const.go diff --git a/pkg/internal/auth/userinfo.go b/pkg/internal/auth/userinfo.go index 46763eb..c93c2ac 100644 --- a/pkg/internal/auth/userinfo.go +++ b/pkg/internal/auth/userinfo.go @@ -6,8 +6,10 @@ import ( "strconv" "time" + "git.solsynth.dev/hypernet/nexus/pkg/internal/cache" "git.solsynth.dev/hypernet/nexus/pkg/internal/directory" "git.solsynth.dev/hypernet/nexus/pkg/nex" + "git.solsynth.dev/hypernet/nexus/pkg/nex/cachekit" "git.solsynth.dev/hypernet/nexus/pkg/nex/sec" "git.solsynth.dev/hypernet/nexus/pkg/proto" "github.com/gofiber/fiber/v2" @@ -20,6 +22,19 @@ func userinfoFetch(c *fiber.Ctx) error { return fiber.NewError(fiber.StatusUnauthorized, "user principal data was not found") } + if val, err := cachekit.Get[sec.UserInfo]( + cache.Kcc, + cachekit.FKey(cachekit.DAUserInfoPrefix, claims.Session), + ); err == nil { + c.Locals("nex_user", &val) + tk, err := IWriter.WriteUserInfoJwt(val) + if err != nil { + return fiber.NewError(fiber.StatusInternalServerError, fmt.Sprintf("unable to sign userinfo: %v", err)) + } + c.Locals("nex_token", tk) + return nil + } + service := directory.GetServiceInstanceByType(nex.ServiceTypeAuth) if service != nil { conn, err := service.GetGrpcConn() diff --git a/pkg/internal/cache/redis.go b/pkg/internal/cache/redis.go index ee3283d..120703c 100644 --- a/pkg/internal/cache/redis.go +++ b/pkg/internal/cache/redis.go @@ -1,8 +1,16 @@ package cache -import "github.com/redis/go-redis/v9" +import ( + "time" -var Rdb *redis.Client + "git.solsynth.dev/hypernet/nexus/pkg/nex/cachekit" + "github.com/redis/go-redis/v9" +) + +var ( + Rdb *redis.Client + Kcc *cachekit.Conn +) func ConnectRedis(addr, password string, db int) error { Rdb = redis.NewClient(&redis.Options{ @@ -10,5 +18,9 @@ func ConnectRedis(addr, password string, db int) error { Password: password, DB: db, }) + Kcc = &cachekit.Conn{ + Rd: Rdb, + Timeout: 3 * time.Second, + } return nil } diff --git a/pkg/nex/cachekit/direct_const.go b/pkg/nex/cachekit/direct_const.go new file mode 100644 index 0000000..3702472 --- /dev/null +++ b/pkg/nex/cachekit/direct_const.go @@ -0,0 +1,13 @@ +package cachekit + +import "fmt" + +// Those constants are used to directly get the cached data from redis +// Formatted like {prefix}#{key} +const ( + DAUserInfoPrefix = "userinfo" +) + +func FKey(prefix string, key any) string { + return fmt.Sprintf("%s#%v", prefix, key) +}