Gin框架系列教程(7)- Gin集成JWT权限认证
不管是我们什么后台,系统,都会接触了用户登录Token认证,今天我们需要gin集成jwt功能。
如今有很多将身份验证内置到API中的方法 -JSON Web令牌只是其中之一。JSON Web令牌(JWT)作为令牌系统而不是在每次请求时都发送用户名和密码,因此比其他方法(如基本身份验证)具有固有的优势。要了解更多信息,请直接进入jwt.io上的介绍,然后再直接学习。
通过JSON形式作为Web应用中的令牌,用于在各方之间安全地将信息作为JSON对象传输,可以避免被别人篡改,以及在用户认证授权方面相对于传统Session减小了开销。
接下来我们使用jwt:直接上代码
package utils
import (
"errors"
"fmt"
"time"
"github.com/dgrijalva/jwt-go/v4"
)
var JwtSecret string = "xxxxxxxxxxxxxx"
type Users struct {
Account string `json:"account"`
Password string `json:"password"`
}
type CustomClaims struct {
Users
jwt.StandardClaims
}
var MySecret = []byte(JwtSecret)
// 创建 Token
func GenToken(user Users) (string, error) {
claim := CustomClaims{
user,
jwt.StandardClaims{
ExpiresAt: jwt.At(time.Now().Add(time.Minute * 120)), //2小时后过期
Issuer: "xxxxxxxx", //签发人
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claim)
return token.SignedString(MySecret)
}
// 解析 token
func ParseToken(tokenStr string) (*CustomClaims, error) {
token, err := jwt.ParseWithClaims(tokenStr, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) {
return MySecret, nil
})
if err != nil {
fmt.Println(" token parse err:", err)
return nil, err
}
if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid {
return claims, nil
}
return nil, errors.New("invalid token")
}
// 刷新 Token
func RefreshToken(tokenStr string) (string, error) {
jwt.TimeFunc = func() time.Time {
return time.Unix(0, 0)
}
token, err := jwt.ParseWithClaims(tokenStr, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) {
return MySecret, nil
})
if err != nil {
return "", err
}
if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid {
jwt.TimeFunc = time.Now
claims.StandardClaims.ExpiresAt = jwt.At(time.Now().Add(time.Minute * 120))
return GenToken(claims.Users)
}
return "", errors.New("Cloudn't handle this token")
}
上面这段是我们用户登录成功创建token。
然后我们需要用一个jwt中间件来验证用户权限:
func Jwt() gin.HandlerFunc {
return func(c *gin.Context) {
// var users utils.Users
// users.Account = "admin"
// users.Password = "12346"
// str, err1 := utils.GenToken(users)
// fmt.Println("str", str)
// fmt.Println("err1", err1)
tokenString := c.GetHeader("Authorization")
fmt.Println("getHeaderToken", tokenString)
if tokenString == "" {
c.JSON(http.StatusUnauthorized, gin.H{"code": http.StatusUnauthorized, "msg": "权限不足"})
c.Abort()
return
}
claims, err := utils.ParseToken(tokenString)
if err != nil {
c.JSON(http.StatusUnauthorized, gin.H{"code": http.StatusUnauthorized, "err": err, "msg": "权限不足"})
c.Abort()
return
}
fmt.Println(claims)
c.Next()
}
}
好了,我们来测试一下,结果是没问题的。
还没有评论,快来发表第一个评论吧