1:需要引进jwt包
go get github.com/dgrijalva/jwt-go
2:重新建立一个middlewares包,在再middlewars包下建立一个关于认证的auth,此中间件用于判断token是否有效,并将有效的Token解析。
package middleware
import (
"demo/common"
"demo/model"
"net/http"
"strings"
"github.com/gin-gonic/gin"
)
func AuthMiddleware() gin.HandlerFunc {
return func(ctx *gin.Context) {
// 获取authorization header
tokenString := ctx.GetHeader("Authorization")
// validate token formate
if tokenString == "" || !strings.HasPrefix(tokenString, "Bearer ") {
ctx.JSON(http.StatusUnauthorized, gin.H{"code": 401, "message": "权限不足"})
ctx.Abort()
return
}
//提取token的有效部分("Bearer "共占7位)
tokenString = tokenString[7:]
token, claims, err := common.ParseToken(tokenString)
if err != nil || !token.Valid {
ctx.JSON(http.StatusUnauthorized, gin.H{"code": 401, "message": "权限不足"})
ctx.Abort()
return
}
// 验证通过后获取claim 中的userId
userId := claims.UserId
DB := common.GetDB()
var user model.User
DB.First(&user, userId)
// 用户不存在
if user.ID == 0 {
ctx.JSON(http.StatusUnauthorized, gin.H{"code": 401, "message": "权限不足"})
ctx.Abort()
return
}
// 用户存在将user的信息写入上下文,方便读取
ctx.Set("user", user)
ctx.Next()
}
}
3.假设在用户登录成功后发放Token,并且使用此Token可以获取用户信息