Skip to main content

golang-jwt

前后端分离的项目更常用的登录验证是JWT(JSON web token)。GoFrame中没有提供相关生成与验证,需要添加第三方库,例如golang-jwt

简单使用方式如下:

  • 添加
go get -u github.com/golang-jwt/jwt/v5
  • 导入
import "github.com/golang-jwt/jwt/v5"
  • 生成token
func (c *Controller) Jwt(req *ghttp.Request) {
type UserClaims struct {
UserID uint
UserName string
jwt.RegisteredClaims
}

const key = "arandomstring"

claim := UserClaims{
UserID: 1011,
UserName: "张之维",
RegisteredClaims: jwt.RegisteredClaims{
Subject: "张之维",
ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Minute * 10)),
},
}
token, err := jwt.NewWithClaims(jwt.SigningMethodHS256, claim).SignedString([]byte(key))
if err == nil {
req.Response.Writeln(token)
} else {
req.Response.Writeln(err)
}
}
  • token验证
func (c *Controller) Jwt(req *ghttp.Request) {
type UserClaims struct {
UserID uint
UserName string
jwt.RegisteredClaims
}

const key = "arandomstring"

token := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySUQiOjEwMTEsIlVzZXJOYW1lIjoi5byg5LmL57u0Iiwic3ViIjoi5byg5LmL57u0IiwiZXhwIjoxNjk4NjcxMjA3fQ.r11R1_WcDueBU52BoUjDS94jqemgrhU-V4WW7YSvXWE"
result, err := jwt.ParseWithClaims(token, &UserClaims{}, func(t *jwt.Token) (interface{}, error) {
return []byte(key), nil
})

if err == nil && result.Valid {
claim, ok := result.Claims.(*UserClaims)
if ok {
req.Response.Writeln("token验证成功")
req.Response.Writeln(claim)
}
req.Response.Writeln(result.Claims)
} else {
req.Response.Writeln(err)
}
}

jwt.RegisteredClaims

type RegisteredClaims struct {
// 发布者
Issuer string `json:"iss,omitempty"`

// token使用主体
Subject string `json:"sub,omitempty"`

//
Audience ClaimStrings `json:"aud,omitempty"`

// 失效时间
ExpiresAt *NumericDate `json:"exp,omitempty"`

// 生效时间
NotBefore *NumericDate `json:"nbf,omitempty"`

// 发布时间
IssuedAt *NumericDate `json:"iat,omitempty"`

// 可以唯一标识这一jwt的字符串,用来防止数据相似的jwt哈希碰撞
ID string `json:"jti,omitempty"`
}