Skip to content

Commit

Permalink
feat: jwt
Browse files Browse the repository at this point in the history
  • Loading branch information
liubf21 committed Dec 27, 2023
1 parent e89fa1c commit eaf22e5
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 7 deletions.
19 changes: 15 additions & 4 deletions go-backend/internal/handler/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package handler
import (
"log"
"net/http"
"strings"
"v-helper/internal/service"
"v-helper/pkg/utils"

Expand All @@ -13,9 +14,11 @@ import (
func SetupRoutes(router *gin.Engine, db *gorm.DB) {
userService := service.NewUserService(db)
userHandler := NewUserHandler(userService)
router.GET("/auth", userHandler.AuthHandler)
router.GET("/users/login", userHandler.LogInHandler)
router.GET("/users/public/:id", userHandler.HandleGetPublicUserByID)

// router.Use(JWTAuthMiddleware())
router.Use(JWTAuthMiddleware())
{
router.POST("/users", userHandler.HandleCreateUser)
router.GET("/users", userHandler.HandleGetAllUsers)
Expand All @@ -27,7 +30,6 @@ func SetupRoutes(router *gin.Engine, db *gorm.DB) {
router.GET("/users/removefollowingVaccine/:id", userHandler.HandleRemoveFollowingVaccine)
router.GET("/users/addfollowingArticle/:id", userHandler.HandleAddFollowingArticle)
router.GET("/users/removefollowingArticle/:id", userHandler.HandleRemoveFollowingArticle)
router.GET("/users/public/:id", userHandler.HandleGetPublicUserByID)

profileService := service.NewProfileService(db)
profileHandler := NewProfileHandler(profileService)
Expand Down Expand Up @@ -112,14 +114,23 @@ func SetupRoutes(router *gin.Engine, db *gorm.DB) {

func JWTAuthMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
token := c.GetHeader("Authorization")
authHeader := c.GetHeader("Authorization")

if token == "" {
if authHeader == "" {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Authorization header is required"})
c.Abort()
return
}

// 分割Bearer和实际的token
parts := strings.Split(authHeader, " ")
if len(parts) != 2 || parts[0] != "Bearer" {
c.JSON(http.StatusUnauthorized, gin.H{"error": "Authorization header format must be Bearer {token}"})
c.Abort()
return
}

token := parts[1]
log.Println("token:", token)

ok, err := utils.VerifyToken(token)
Expand Down
24 changes: 24 additions & 0 deletions go-backend/internal/handler/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"strconv"
"v-helper/internal/model"
"v-helper/internal/service"
"v-helper/pkg/utils"

"github.com/gin-gonic/gin"
"github.com/go-resty/resty/v2"
Expand Down Expand Up @@ -37,6 +38,22 @@ func NewUserHandler(userService *service.UserService) *UserHandler {
return &UserHandler{userService: userService}
}

func (h *UserHandler) AuthHandler(c *gin.Context) {
user := model.User{OpenID: "Admin"}
token, err := utils.GenerateJWT(user)

if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
if len(token) == 0 {
c.JSON(http.StatusInternalServerError, gin.H{"error": "token is empty"})
return
}
fmt.Println("token:", token)
c.JSON(http.StatusOK, gin.H{"token": token})
}

func (h *UserHandler) LogInHandler(c *gin.Context) {
// 通过code得到openid,在得到对应用户信息,若不存在则新建用户
jsCode := c.Query("code")
Expand Down Expand Up @@ -75,6 +92,13 @@ func (h *UserHandler) LogInHandler(c *gin.Context) {
c.JSON(500, gin.H{"error": err.Error()})
return
}
token, err := utils.GenerateJWT(user)
if err != nil {
c.JSON(500, gin.H{"error": err.Error()})
return
}

user.Token = token
c.JSON(http.StatusOK, user)
}

Expand Down
13 changes: 11 additions & 2 deletions go-backend/pkg/utils/jwt_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
)

func TestGenerateJWT(t *testing.T) {
user := model.User{OpenID: "1234567890"} // 假设的用户模型
user := model.User{OpenID: "Admin"} // 假设的用户模型
token, err := GenerateJWT(user)

if err != nil {
Expand All @@ -21,7 +21,7 @@ func TestGenerateJWT(t *testing.T) {
}

func TestParseJWT(t *testing.T) {
user := model.User{OpenID: "1234567890"} // 假设的用户模型
user := model.User{OpenID: "Admin"} // 假设的用户模型
tokenString, _ := GenerateJWT(user)
fmt.Println("tokenString:", tokenString)

Expand All @@ -33,4 +33,13 @@ func TestParseJWT(t *testing.T) {
t.Errorf("ParseJWT() claims.OpenID = %v, want %v", claims.OpenID, user.OpenID)
}
fmt.Println("claims:", claims)

ok, err := VerifyToken(tokenString)
if err != nil {
t.Errorf("ValidateJWT() error = %v, wantErr %v", err, nil)
}
if !ok {
t.Errorf("ValidateJWT() ok = %v, want %v", ok, true)
}

}
4 changes: 3 additions & 1 deletion go-backend/pkg/utils/jwt_utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package utils

import (
"fmt"
"log"
"time"
"v-helper/internal/model"

Expand Down Expand Up @@ -51,7 +52,8 @@ func ParseJWT(tokenString string) (*JWTClaims, error) {

// VerifyToken 验证 JWT 令牌
func VerifyToken(tokenString string) (bool, error) {
_, err := ParseJWT(tokenString)
claims, err := ParseJWT(tokenString)
log.Println("claims:", claims)
if err != nil {
return false, err
}
Expand Down

0 comments on commit eaf22e5

Please sign in to comment.