[bugfix/backend] /users/me handling

This commit is contained in:
CDN 2025-02-21 04:55:42 +08:00
parent 823bedd1fa
commit d8d8e4b0d7
Signed by: CDN
GPG key ID: 0C656827F9F80080
3 changed files with 228 additions and 156 deletions

View file

@ -86,7 +86,7 @@ func (h *Handler) Register(c *gin.Context) {
// Generate JWT token // Generate JWT token
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"sub": user.ID, "sub": int64(user.ID), // 将用户 ID 转换为 int64
"roles": roleNames, "roles": roleNames,
"exp": time.Now().Add(24 * time.Hour).Unix(), "exp": time.Now().Add(24 * time.Hour).Unix(),
}) })
@ -162,7 +162,7 @@ func (h *Handler) Login(c *gin.Context) {
// Generate JWT token // Generate JWT token
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"sub": user.ID, "sub": int64(user.ID), // 将用户 ID 转换为 int64
"roles": roleNames, "roles": roleNames,
"exp": time.Now().Add(24 * time.Hour).Unix(), "exp": time.Now().Add(24 * time.Hour).Unix(),
}) })

View file

@ -7,6 +7,7 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"tss-rocks-be/internal/types" "tss-rocks-be/internal/types"
"fmt"
) )
type UpdateCurrentUserRequest struct { type UpdateCurrentUserRequest struct {
@ -160,24 +161,39 @@ func (h *Handler) DeleteUser(c *gin.Context) {
// GetCurrentUser returns the current user's information // GetCurrentUser returns the current user's information
func (h *Handler) GetCurrentUser(c *gin.Context) { func (h *Handler) GetCurrentUser(c *gin.Context) {
// 从上下文中获取用户ID由认证中间件设置
userID, exists := c.Get("user_id") userID, exists := c.Get("user_id")
if !exists { if !exists {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"}) c.JSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"})
return return
} }
// 将用户ID转换为int64
var id int64
switch v := userID.(type) {
case int64:
id = v
case int:
id = int64(v)
case float64:
id = int64(v)
default:
log.Error().
Str("type", fmt.Sprintf("%T", userID)).
Interface("value", userID).
Msg("Invalid user_id type")
c.JSON(http.StatusInternalServerError, gin.H{"error": "Invalid user_id type"})
return
}
// 获取用户信息 // 获取用户信息
user, err := h.service.GetUser(c.Request.Context(), userID.(int)) user, err := h.service.GetUser(c.Request.Context(), int(id))
if err != nil { if err != nil {
log.Error().Err(err).Msg("Failed to get user") log.Error().Err(err).Msg("Failed to get user")
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to get user information"}) c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to get user information"})
return return
} }
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, user)
"data": user,
})
} }
// UpdateCurrentUser updates the current user's information // UpdateCurrentUser updates the current user's information

View file

@ -1,7 +1,10 @@
package middleware package middleware
import ( import (
"encoding/json"
"fmt"
"net/http" "net/http"
"strconv"
"strings" "strings"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@ -41,8 +44,61 @@ func AuthMiddleware(jwtSecret string) gin.HandlerFunc {
} }
if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
c.Set("user_id", claims["sub"]) // 添加调试信息
c.Set("user_role", claims["role"]) log.Debug().Interface("claims", claims).Msg("Token claims")
// 获取用户ID
sub, exists := claims["sub"]
if !exists {
log.Error().Msg("Token does not contain sub claim")
c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token format"})
c.Abort()
return
}
// 打印类型信息
log.Debug().
Str("type", fmt.Sprintf("%T", sub)).
Interface("value", sub).
Msg("User ID from token")
var userID int
switch v := sub.(type) {
case string:
var err error
userID, err = strconv.Atoi(v)
if err != nil {
log.Error().Err(err).Str("sub", v).Msg("Failed to convert string user ID to int")
c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid user ID format"})
c.Abort()
return
}
case float64:
userID = int(v)
case json.Number:
var err error
userID, err = strconv.Atoi(v.String())
if err != nil {
log.Error().Err(err).Str("sub", v.String()).Msg("Failed to convert json.Number user ID to int")
c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid user ID format"})
c.Abort()
return
}
default:
log.Error().
Str("type", fmt.Sprintf("%T", sub)).
Interface("value", sub).
Msg("Unexpected user ID type")
c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid user ID type"})
c.Abort()
return
}
// 将 userID 转换为 int64 以确保类型一致性
c.Set("user_id", int64(userID))
if roles, ok := claims["roles"].([]interface{}); ok {
c.Set("user_roles", roles)
}
c.Next() c.Next()
} else { } else {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token"}) c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token"})