GIN 接入JWT

发布时间 2023-09-07 17:46:16作者: lisus2000

GIN,JWT下载地址

github地址:https://github.com/golang-jwt/jwt

文档地址:https://pkg.go.dev/github.com/golang-jwt/jwt

下载:go get github.com/golang-jwt/jwt

package main

import (
"github.com/gin-gonic/gin"
"github.com/golang-jwt/jwt"
"net/http"
"time"
)

// MyCustomClaims 第一步:定义结构体
// MyClaims 定义结构体并继承jwt.StandardClaims
// jwt包自带的jwt.StandardClaims只包含了官方字段
// 我们需要额外记录一个username和id字段,所以要自定义结构体
// 如果想要保存更多信息,都可以添加到这个结构体中
type MyCustomClaims struct {
Id int `json:"id"`
UserName string `json:"userName"`
jwt.StandardClaims
}

// 定义key
var mySigningKey = []byte("slot")

func genToken(claims MyCustomClaims) (string, error) {
// 使用HS256加密方式,注意不要使用ES256,非对称加密会报错
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
signToken, err := token.SignedString(mySigningKey)
if err != nil {
return "", err
}
return signToken, nil
}

func parseToken(signToken string) (*MyCustomClaims, error) {
var claims MyCustomClaims
token, err := jwt.ParseWithClaims(signToken, &claims, func(token *jwt.Token) (interface{}, error) {
return mySigningKey, nil
})
if token.Valid {
return &claims, nil
} else {
return nil, err
}
}

func JWTAuthMiddleware(c *gin.Context) {
//从请求头中取出
signToken := c.Request.Header.Get("Authorization")
if signToken == "" {
c.JSON(http.StatusOK, gin.H{
"code": 10002,
"msg": "token为空",
})
c.Abort()
return
}
//校验TOKEN
myclaims, err := parseToken(signToken)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"code": 10003,
"msg": "token校验失败",
})
c.Abort()
return
}
// 将用户的id放在到请求的上下文c上
c.Set("userid", myclaims.Id)
c.Next() // 后续的处理函数可以用过c.Get("userid")来获取当前请求的id
}

func main() {
r := gin.Default()
r.POST("/login", func(c *gin.Context) {
userName := c.PostForm("userName")
password := c.PostForm("password")

if userName == "admin" && password == "admin" {
token, _ := genToken(MyCustomClaims{1, "admin", jwt.StandardClaims{
ExpiresAt: time.Now().Add(7 * time.Hour).Unix(), // 过期时间
Issuer: "admin", // 签发人
}})
c.JSON(200, gin.H{"code": "100", "msg": "登陆成功", "token": token})
} else {
c.JSON(200, gin.H{"code": "101", "msg": "用户名或密码错误"})
}
})
r.GET("/admin/index", JWTAuthMiddleware, func(c *gin.Context) {
c.JSON(200, gin.H{"code": 10000, "msg": "success"})
})
r.Run(":8080")
}