diff --git a/backend/internal/api/auth.go b/backend/internal/api/auth.go index 3404d58..f7add06 100644 --- a/backend/internal/api/auth.go +++ b/backend/internal/api/auth.go @@ -9,6 +9,7 @@ import ( "github.com/hhs/camtalk/internal/auth" apperr "github.com/hhs/camtalk/internal/errors" "github.com/hhs/camtalk/internal/ratelimit" + "github.com/hhs/camtalk/internal/trace" ) // AuthHandler 提供认证相关的 REST 端点。 @@ -53,6 +54,9 @@ func (h *AuthHandler) RegisterRoutes(rg *gin.RouterGroup, limiter ratelimit.Limi // Register POST /api/auth/register — 用户注册。 func (h *AuthHandler) Register(c *gin.Context) { + log := trace.FromContext(c.Request.Context()) + clientIP := c.ClientIP() + var req auth.RegisterRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{ @@ -72,15 +76,25 @@ func (h *AuthHandler) Register(c *gin.Context) { resp, err := h.authService.Register(c.Request.Context(), req) if err != nil { + log.Warnw("register failed", + "username", req.Username, + "client_ip", clientIP, + "error", err) handleAuthError(c, err) return } + log.Infow("register success", + "username", req.Username, + "client_ip", clientIP) c.JSON(http.StatusCreated, resp) } // Login POST /api/auth/login — 用户登录。 func (h *AuthHandler) Login(c *gin.Context) { + log := trace.FromContext(c.Request.Context()) + clientIP := c.ClientIP() + var req auth.LoginRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{ @@ -100,15 +114,24 @@ func (h *AuthHandler) Login(c *gin.Context) { resp, err := h.authService.Login(c.Request.Context(), req) if err != nil { + log.Warnw("login failed", + "username", req.Username, + "client_ip", clientIP, + "error", err) handleAuthError(c, err) return } + log.Infow("login success", + "username", req.Username, + "client_ip", clientIP) c.JSON(http.StatusOK, resp) } // Refresh POST /api/auth/refresh — 刷新令牌。 func (h *AuthHandler) Refresh(c *gin.Context) { + log := trace.FromContext(c.Request.Context()) + var req auth.RefreshRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{ @@ -128,15 +151,21 @@ func (h *AuthHandler) Refresh(c *gin.Context) { resp, err := h.authService.Refresh(c.Request.Context(), req) if err != nil { + log.Warnw("token refresh failed", + "client_ip", c.ClientIP(), + "error", err) handleAuthError(c, err) return } + log.Infow("token refresh success", + "client_ip", c.ClientIP()) c.JSON(http.StatusOK, resp) } // Logout POST /api/auth/logout — 登出(需要认证)。 func (h *AuthHandler) Logout(c *gin.Context) { + log := trace.FromContext(c.Request.Context()) userID := c.GetString(auth.ContextKeyUserID) var req struct { @@ -159,6 +188,9 @@ func (h *AuthHandler) Logout(c *gin.Context) { } if err := h.authService.Logout(c.Request.Context(), userID, req.RefreshToken); err != nil { + log.Errorw("logout failed", + "user_id", userID, + "error", err) c.JSON(http.StatusInternalServerError, gin.H{ "code": apperr.CodeInternalError, "message": "failed to logout", @@ -166,6 +198,8 @@ func (h *AuthHandler) Logout(c *gin.Context) { return } + log.Infow("logout success", + "user_id", userID) c.JSON(http.StatusOK, gin.H{ "message": "logged out successfully", })