1、安装gin
go get -u github.com/gin-gonic/gin
2、安装session
go get github.com/gin-contrib/sessions
3、安装JWT鉴权
go get "github.com/golang-jwt/jwt/v4"
4、创建一个jwt的工具文件
package utils
import (
"errors"
"github.com/golang-jwt/jwt/v4"
"time"
)
type MyClaims struct {
Phone string `json:"phone"`
jwt.RegisteredClaims // 注意!这是jwt-go的v4版本新增的,原先是jwt.StandardClaims
}
var MySecret = []byte("wjdsg") // 定义secret,后面会用到
func Secret() jwt.Keyfunc {
return func(token *jwt.Token) (interface{}, error) {
return []byte(MySecret), nil // 这是我的secret
}
}
// 这里传入的是手机号,因为我项目登陆用的是手机号和密码
func MakeToken(phone string) (tokenString string, err error) {
claim := MyClaims{
Phone: phone,
RegisteredClaims: jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(time.Now().Add(3 * time.Hour * time.Duration(1))), // 过期时间3小时
IssuedAt: jwt.NewNumericDate(time.Now()), // 签发时间
NotBefore: jwt.NewNumericDate(time.Now()), // 生效时间
}}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claim) // 使用HS256算法
tokenString, err = token.SignedString(MySecret)
return tokenString, err
}
// 解析jwt
func ParseToken(tokenss string) (*MyClaims, error) {
token, err := jwt.ParseWithClaims(tokenss, &MyClaims{}, Secret())
if err != nil {
if ve, ok := err.(*jwt.ValidationError); ok {
if ve.Errors&jwt.ValidationErrorMalformed != 0 {
return nil, errors.New("非法令牌")
} else if ve.Errors&jwt.ValidationErrorExpired != 0 {
return nil, errors.New("令牌国企")
} else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 {
return nil, errors.New("令牌未激活")
} else {
return nil, errors.New("令牌未知错误")
}
}
}
if claims, ok := token.Claims.(*MyClaims); ok && token.Valid {
return claims, nil
}
return nil, errors.New("couldn't handle this token")
}
5、开始使用
package main
import (
"awesomeProject/utils"
"fmt"
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/cookie"
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
// 初始化gin服务
rootRouter := gin.Default()
// 创建cookie存储
store := cookie.NewStore([]byte("secret"))
//路由上加入session中间件
rootRouter.Use(sessions.Sessions("mysession", store))
//配置路由组
group := rootRouter.Group("/wjdsg")
{
group.GET("/set", func(context *gin.Context) {
session := sessions.Default(context)
token, err := utils.MakeToken("15088888888")
if err != nil {
fmt.Println("jwt生产错误")
}
//将jwt保持到session中
session.Set("adminId", token)
session.Save()
context.JSON(http.StatusOK, token)
})
group.GET("/get", func(context *gin.Context) {
//获取jwt
session := sessions.Default(context)
token := session.Get("adminId").(string)
//解析jwt
parseToken, err := utils.ParseToken(token)
if err != nil {
fmt.Println("jwt解析错误:", err)
}
m := make(map[string]interface{})
m["jwt"] = token
m["解析"] = parseToken
context.JSON(http.StatusOK, m)
})
}
//启动http服务,可以修改端口
address := fmt.Sprintf(":%d", 8080)
rootRouter.Run(address)
}
6、结果