golang jwt鉴权

总结一下jwt的使用

从22年旧博客贴过来的文,稍微进行了整理。

1. 安装

终端安装即可:

1
go get github.com/dgrijalva/jwt-go

2. 使用

首先定义结构体用来生成token

1
2
3
4
5
type Claim struct {
Id int
User string
jwt.StandardClaims
}

其中jwt.StandardClaims为标准claims结构

设置过期时间 ExpiretTime=2d

1
claim.ExpiresAt = time.Now().Add(ExpireTime).Unix()

设置签发人

1
claim.Issuer = "SYMC"

生成token,第一个参数为加密方式,第二个需要传入自定义的结构体,之后加盐

1
token,err:=jwt.NewWithClaims(jwt.SigningMethodHS256, claim).SignedString("SYMC")

实际上使用是,并不应该将SignedString写到代码中,一是不方便修改,二是在使用代码托管平台上传代码时会泄密。应该使用viper等工具读取配置。

解析函数,第一个参数为需要解析的token字符串,第二个参数为我们自定义的结构,第三个为固定格式的函数写法

1
2
3
token, err := jwt.ParseWithClaims(tokenStr, &Claim{}, func(token *jwt.Token) (interface{}, error) {
return secret, nil
})

通过断言取得claim(我们自定义的结构)指针

1
claim, ok := token.Claims.(*Claim)

3. 完整代码

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
var secret = "SYMC"                 //盐
var ExpireTime = time.Hour * 24 * 2 //过期时间2d
type Jwt struct {
Id int `json:"id"`
User string `json:"user"`
jwt.StandardClaims
}

func GenerateTokenHandler(c *gin.Context) {
var claim Jwt
c.ShouldBindJSON(&claim)
claim.ExpiresAt = time.Now().Add(ExpireTime).Unix() //过期时间
claim.Issuer = "SYMC" //签发人
token, err := GenToken(claim)
if err != nil {
c.JSON(400, gin.H{
"code": 400,
"msg": "error",
})
}
c.JSON(200, gin.H{
"code": 200,
"msg": "success",
"token": token,
})
}
func GenToken(claim Jwt) (string, error) {
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claim)
signedToken, err := token.SignedString("SYMC") //加盐
if err != nil {
return "", err
}
return signedToken, nil
}
func ParseToken(tokenStr string) (*Jwt, error) {
token, err := jwt.ParseWithClaims(tokenStr, &Jwt{}, func(token *jwt.Token) (interface{}, error) {
return secret, nil
})
if err != nil {
return nil, err
}
claim, ok := token.Claims.(*Jwt)
if ok && token.Valid {
return claim, nil
}
return nil, errors.New("invalid token")
}

4. 中间件

用于解析的中间件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
func Authorization(c *gin.Context) {
token := c.GetHeader("Authorization")
if token == "" {
c.JSON(401, gin.H{
"code": 401,
"msg": "none token",
})
c.Abort()
return
}
claim, err := utility.ParseToken(token)
if err != nil {
c.JSON(401, gin.H{
"code": 401,
"msg": "invalid token",
})
c.Abort()
return
}
c.Set("Id", claim.Id)
c.Set("User", claim.User)
c.Next()
}

值得注意的是c.set是用于c(Gin.Context类型)中传递数据,通过c.get取得内容


golang jwt鉴权
https://symcreg.github.io/2025/06/27/golang-jwt鉴权/
作者
sam
发布于
2025年6月27日
许可协议