0%

jwt-go

github

Documentation

引入包

1
go get "github.com/dgrijalva/jwt-go"
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
package common

import (
"gin_vue_bs/model"
"time"

"github.com/dgrijalva/jwt-go"
)

//定义 jwt 加密密钥
var jwtKey = []byte("a_secret_crect")

//Claims .
type Claims struct {
UserID uint
jwt.StandardClaims
}

//ReleaseToken 登录成功则调用该方法发放token.
func ReleaseToken(user model.User) (string, error) {
expirationTime := time.Now().Add(7 * 24 * time.Hour) //token的过期时间7天
claims := &Claims{
UserID: user.ID,
StandardClaims: jwt.StandardClaims{
ExpiresAt: expirationTime.Unix(),
IssuedAt: time.Now().Unix(), //token发放时间
Issuer: "samtake", //是谁发放的token
Subject: "user token", //主题
},
}

token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenString, err := token.SignedString(jwtKey)

if err != nil {
return "", err
}

return tokenString, nil
}

返回

1
2
3
4
5
6
7
{
"code": "200",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySUQiOjMsImV4cCI6MTU4NzA1MjA0MiwiaWF0IjoxNTg2NDQ3MjQyLCJpc3MiOiJzYW10YWtlIiwic3ViIjoidXNlciB0b2tlbiJ9.6a50w6SfsQH7XZBW7zu3_FEGFcrWHRAh2DFYTh9hbCo"
},
"msg": "登录成功"
}

所返回的token由三部分组成:协议头(token的加密协议)、 源码claims储存的信息 、(前面两部分+jwtKey)的哈希值:

1
2
3
4
5
6
7
➜  blogs echo eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9  | base64 -D                                                                                                                                                         
{"alg":"HS256","typ":"JWT"}%
➜ blogs echo eyJVc2VySUQiOjMsImV4cCI6MTU4NzA1MjA0MiwiaWF0IjoxNTg2NDQ3MjQyLCJpc3MiOiJzYW10YWtlIiwic3ViIjoidXNlciB0b2tlbiJ9 | base64 -D
{"UserID":3,"exp":1587052042,"iat":1586447242,"iss":"samtake","sub":"user token"}%
➜ blogs echo 6a50w6SfsQH7XZBW7zu3_FEGFcrWHRAh2DFYTh9hbCo | base64 -D
?tä???]?V?;??Q??!?1XNa%
➜ blogs