Golang Jwt集成
Jwt#
Github: https://github.com/golang-jwt/jwt
文档:https://pkg.go.dev/github.com/golang-jwt/jwt
拉取仓库
go get https://github.com/golang-jwt/jwt
代码编写#
配置文件#
jwt:
key: "WXlqEk8BJXmAjtp" // 随机生成
定义 Payload 结构体 和 逻辑代码#
request.go
package jwtauth
import (
"errors"
"github.com/golang-jwt/jwt"
"go.uber.org/zap"
"micro-shop-api/user-web/global"
"time"
)
// CustomClaims 自定义 Payload 信息
type CustomClaims struct {
Id uint // 用户id
Mobile string // 手机号
Nickname string // 用户昵称
jwt.StandardClaims
}
func NewCustomClaimsDefault(id uint, mobile string, nickname string) *CustomClaims {
beforeTime := time.Now().Unix()
return &CustomClaims{
Id: id,
Mobile: mobile,
Nickname: nickname,
StandardClaims: jwt.StandardClaims{
NotBefore: beforeTime, // 生效时间
ExpiresAt: beforeTime + 60*60*24, // 失效时间
Issuer: "lzscxb", // 机构
},
}
}
type JWT struct {
singKey []byte // Jwt 密钥
}
var (
TokenExpired = errors.New("Token is expired") // 令牌过期
TokenNotValidYet = errors.New("Token not active yet") // 令牌未生效
TokenMalformed = errors.New("that's not even a token") // 令牌不完整
TokenInvalid = errors.New("") // 无效令牌
)
// NewJWT 返回一个JWT 实例
func NewJWT() *JWT {
return &JWT{
singKey: []byte(global.Config.JwtInfo.SingKey),
}
}
// CreateToken 创建新的 Token
func (j *JWT) CreateToken(claims CustomClaims) (token string, err error) {
withClaims := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
return withClaims.SignedString(j.singKey)
}
// ParseToken 验证 Token
func (j *JWT) ParseToken(token string) (*CustomClaims, error) {
withClaims, err := jwt.ParseWithClaims(token, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) {
return j.singKey, nil
})
if err != nil {
// 获取到 Jwt ValidationError 错误类型
if ve, ok := err.(*jwt.ValidationError); ok {
zap.S().Infof("获取到 Jwt ValidationError 原:%v 错误类型:%v", err, ve.Errors)
if ve.Errors&jwt.ValidationErrorMalformed != 0 { // 令牌不完整
return nil, TokenMalformed
} else if ve.Errors&jwt.ValidationErrorExpired != 0 { // 令牌过期
return nil, TokenExpired
} else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 { // 令牌还未生效
return nil, TokenNotValidYet
} else {
return nil, TokenInvalid
}
}
return nil, TokenInvalid
}
if withClaims == nil {
return nil, TokenInvalid
}
if claims, ok := withClaims.Claims.(*CustomClaims); ok { // 验证成功
return claims, nil
}
return nil, TokenInvalid
}
示例#
生成 Token#
j := jwtauth.NewJWT()
claims := jwtauth.NewCustomClaimsDefault(uint(id),mobile, nickname)
token, err := j.CreateToken(*claims)
if err != nil {
return
}
fmt.Println(token)
中间件验证 Token#
func JwtAuth() gin.HandlerFunc {
return func(c *gin.Context) {
// 获取 header 中的 token
token := c.GetHeader("Authorization")
j := jwtauth.NewJWT()
// 验证 token
claims, err := j.ParseToken(token)
if err != nil {
// 验证失败
c.Abort() // 中断,中间件中 return 不生效
}
c.Set("uid", claims.Id)
c.Set("mobile", claims.Mobile)
c.Next()
}
}
使用中间件
UserRoute := router.Group("user").Use(middleware.JwtAuth())
分类:
Golang
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了