| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- package controller
- import (
- "fmt"
- "net/http"
- "strconv"
- "strings"
- "time"
- "woord-core-service/global"
- "github.com/gin-gonic/gin"
- "github.com/golang-jwt/jwt/v4"
- )
- const AuthUserKey = "user"
- var (
- ErrNotLoggedIn = fmt.Errorf("请先登录")
- ErrInvalidToken = fmt.Errorf("登录失效,请重新登录")
- )
- // 根据用户 ID 生成 JWT
- func newToken(userID uint) (string, error) {
- token := jwt.NewWithClaims(jwt.SigningMethodHS256, &jwt.RegisteredClaims{
- Subject: strconv.FormatUint(uint64(userID), 10),
- ExpiresAt: jwt.NewNumericDate(time.Now().Add(720 * time.Hour)),
- })
- return token.SignedString(global.SecretKey)
- }
- // 根据 JWT 解析用户 ID
- func parseToken(tokenString string) (uint, error) {
- token, err := jwt.ParseWithClaims(tokenString, &jwt.RegisteredClaims{}, func(token *jwt.Token) (any, error) {
- // 检查签名方法是否正确
- if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
- return nil, fmt.Errorf("unexpected signing method: %s", token.Method.Alg())
- }
- return global.SecretKey, nil
- })
- if claims, ok := token.Claims.(*jwt.RegisteredClaims); ok && token.Valid {
- userID, err := strconv.ParseUint(claims.Subject, 10, 0)
- return uint(userID), err
- }
- return 0, err
- }
- // JWT 认证中间件
- func JWTAuth() gin.HandlerFunc {
- return func(c *gin.Context) {
- // 获取 Authorization 请求头
- auth := strings.Split(c.GetHeader("Authorization"), " ")
- if len(auth) < 2 || auth[0] != "Bearer" {
- respondError(c, http.StatusUnauthorized, ErrNotLoggedIn)
- c.Abort()
- return
- }
- // 解析 JWT
- userID, err := parseToken(auth[1])
- if err != nil {
- respondError(c, http.StatusUnauthorized, ErrInvalidToken)
- c.Abort()
- return
- }
- // 将用户 ID 保存在上下文中
- c.Set(AuthUserKey, userID)
- }
- }
|