From 71d32d73bbbaa3d65e8b8930dd9534f611283001 Mon Sep 17 00:00:00 2001 From: Chang lue Tsen Date: Fri, 5 Sep 2025 09:26:10 -0400 Subject: [PATCH] feat(oauth): add user agent and IP logging to registration and login processes --- .../auth/telephoneUserRegisterHandler.go | 1 + internal/handler/auth/userRegisterHandler.go | 1 + .../auth/oauth/oAuthLoginGetTokenLogic.go | 53 ++++++++++++++----- 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/internal/handler/auth/telephoneUserRegisterHandler.go b/internal/handler/auth/telephoneUserRegisterHandler.go index 5388e2c..45a7ba8 100644 --- a/internal/handler/auth/telephoneUserRegisterHandler.go +++ b/internal/handler/auth/telephoneUserRegisterHandler.go @@ -25,6 +25,7 @@ func TelephoneUserRegisterHandler(svcCtx *svc.ServiceContext) func(c *gin.Contex } // get client ip req.IP = c.ClientIP() + req.UserAgent = c.Request.UserAgent() if svcCtx.Config.Verify.RegisterVerify { verifyTurns := turnstile.New(turnstile.Config{ Secret: svcCtx.Config.Verify.TurnstileSecret, diff --git a/internal/handler/auth/userRegisterHandler.go b/internal/handler/auth/userRegisterHandler.go index d7a2aec..ea40223 100644 --- a/internal/handler/auth/userRegisterHandler.go +++ b/internal/handler/auth/userRegisterHandler.go @@ -20,6 +20,7 @@ func UserRegisterHandler(svcCtx *svc.ServiceContext) func(c *gin.Context) { _ = c.ShouldBind(&req) // get client ip req.IP = c.ClientIP() + req.UserAgent = c.Request.UserAgent() if svcCtx.Config.Verify.RegisterVerify { verifyTurns := turnstile.New(turnstile.Config{ Secret: svcCtx.Config.Verify.TurnstileSecret, diff --git a/internal/logic/auth/oauth/oAuthLoginGetTokenLogic.go b/internal/logic/auth/oauth/oAuthLoginGetTokenLogic.go index e5e246b..e84bc30 100644 --- a/internal/logic/auth/oauth/oAuthLoginGetTokenLogic.go +++ b/internal/logic/auth/oauth/oAuthLoginGetTokenLogic.go @@ -68,7 +68,7 @@ func (l *OAuthLoginGetTokenLogic) OAuthLoginGetToken(req *types.OAuthLoginGetTok l.recordLoginStatus(loginStatus, userInfo, ip, userAgent, requestID, req.Method) }() - userInfo, err = l.handleOAuthProvider(req, requestID) + userInfo, err = l.handleOAuthProvider(req, requestID, ip, userAgent) if err != nil { return nil, err } @@ -82,7 +82,7 @@ func (l *OAuthLoginGetTokenLogic) OAuthLoginGetToken(req *types.OAuthLoginGetTok return &types.LoginResponse{Token: token}, nil } -func (l *OAuthLoginGetTokenLogic) google(req *types.OAuthLoginGetTokenRequest, requestID string) (*user.User, error) { +func (l *OAuthLoginGetTokenLogic) google(req *types.OAuthLoginGetTokenRequest, requestID, ip, userAgent string) (*user.User, error) { startTime := time.Now() l.Infow("google oauth processing started", logger.Field("request_id", requestID), @@ -157,10 +157,10 @@ func (l *OAuthLoginGetTokenLogic) google(req *types.OAuthLoginGetTokenRequest, r logger.Field("duration_ms", time.Since(startTime).Milliseconds()), ) - return l.findOrRegisterUser(OAuthGoogle, googleUserInfo.OpenID, googleUserInfo.Email, googleUserInfo.Picture, requestID) + return l.findOrRegisterUser(OAuthGoogle, googleUserInfo.OpenID, googleUserInfo.Email, googleUserInfo.Picture, requestID, ip, userAgent) } -func (l *OAuthLoginGetTokenLogic) apple(req *types.OAuthLoginGetTokenRequest, requestID string) (*user.User, error) { +func (l *OAuthLoginGetTokenLogic) apple(req *types.OAuthLoginGetTokenRequest, requestID, ip, userAgent string) (*user.User, error) { startTime := time.Now() l.Infow("apple oauth processing started", logger.Field("request_id", requestID), @@ -257,10 +257,10 @@ func (l *OAuthLoginGetTokenLogic) apple(req *types.OAuthLoginGetTokenRequest, re logger.Field("duration_ms", time.Since(startTime).Milliseconds()), ) - return l.findOrRegisterUser(OAuthApple, appleUnique, email, "", requestID) + return l.findOrRegisterUser(OAuthApple, appleUnique, email, "", requestID, ip, userAgent) } -func (l *OAuthLoginGetTokenLogic) telegram(req *types.OAuthLoginGetTokenRequest, requestID string) (*user.User, error) { +func (l *OAuthLoginGetTokenLogic) telegram(req *types.OAuthLoginGetTokenRequest, requestID, ip, userAgent string) (*user.User, error) { startTime := time.Now() l.Infow("telegram oauth processing started", logger.Field("request_id", requestID), @@ -320,10 +320,10 @@ func (l *OAuthLoginGetTokenLogic) telegram(req *types.OAuthLoginGetTokenRequest, logger.Field("duration_ms", time.Since(startTime).Milliseconds()), ) - return l.findOrRegisterUser(OAuthTelegram, userID, email, avatar, requestID) + return l.findOrRegisterUser(OAuthTelegram, userID, email, avatar, requestID, ip, userAgent) } -func (l *OAuthLoginGetTokenLogic) register(email, avatar, method, openid, requestID string) (*user.User, error) { +func (l *OAuthLoginGetTokenLogic) register(email, avatar, method, openid, requestID, ip, userAgent string) (*user.User, error) { startTime := time.Now() l.Infow("user registration started", logger.Field("request_id", requestID), @@ -424,6 +424,31 @@ func (l *OAuthLoginGetTokenLogic) register(email, avatar, method, openid, reques logger.Field("duration_ms", time.Since(startTime).Milliseconds()), ) + // Register log + registerLog := log.Register{ + AuthMethod: method, + Identifier: openid, + RegisterIP: ip, + UserAgent: userAgent, + Timestamp: time.Now().UnixMilli(), + } + content, _ := registerLog.Marshal() + + err = l.svcCtx.LogModel.Insert(l.ctx, &log.SystemLog{ + Type: log.TypeRegister.Uint8(), + Date: time.Now().Format("2006-01-02"), + ObjectID: userInfo.Id, + Content: string(content), + }) + if err != nil { + l.Errorw("failed to insert register log", + logger.Field("request_id", requestID), + logger.Field("user_id", userInfo.Id), + logger.Field("ip", ip), + logger.Field("error", err.Error()), + ) + } + return userInfo, err } @@ -514,7 +539,7 @@ func (l *OAuthLoginGetTokenLogic) recordLoginStatus(loginStatus bool, userInfo * } } -func (l *OAuthLoginGetTokenLogic) handleOAuthProvider(req *types.OAuthLoginGetTokenRequest, requestID string) (*user.User, error) { +func (l *OAuthLoginGetTokenLogic) handleOAuthProvider(req *types.OAuthLoginGetTokenRequest, requestID, ip, userAgent string) (*user.User, error) { l.Debugw("handling oauth provider", logger.Field("request_id", requestID), logger.Field("provider", req.Method), @@ -522,11 +547,11 @@ func (l *OAuthLoginGetTokenLogic) handleOAuthProvider(req *types.OAuthLoginGetTo switch req.Method { case OAuthGoogle: - return l.google(req, requestID) + return l.google(req, requestID, ip, userAgent) case OAuthApple: - return l.apple(req, requestID) + return l.apple(req, requestID, ip, userAgent) case OAuthTelegram: - return l.telegram(req, requestID) + return l.telegram(req, requestID, ip, userAgent) default: l.Errorw("unsupported oauth login method", logger.Field("request_id", requestID), @@ -715,7 +740,7 @@ func (l *OAuthLoginGetTokenLogic) getTelegramConfig(requestID string) (*auth.Tel return &cfg, nil } -func (l *OAuthLoginGetTokenLogic) findOrRegisterUser(authType, openID, email, avatar, requestID string) (*user.User, error) { +func (l *OAuthLoginGetTokenLogic) findOrRegisterUser(authType, openID, email, avatar, requestID, ip, userAgent string) (*user.User, error) { l.Debugw("finding or registering user", logger.Field("request_id", requestID), logger.Field("auth_type", authType), @@ -732,7 +757,7 @@ func (l *OAuthLoginGetTokenLogic) findOrRegisterUser(authType, openID, email, av logger.Field("openid", openID), logger.Field("email", email), ) - return l.register(email, avatar, authType, openID, requestID) + return l.register(email, avatar, authType, openID, requestID, ip, userAgent) } l.Errorw("failed to find user auth method by openid", logger.Field("request_id", requestID),