1、安装拓展包
$ go get -u github.com/dgrijalva/jwt-go
2、发放token
func ReleaseToken(user *model.User) (tokenString string,err error) {
expire := time.Now().Add(7 * 24 * time.Hour)
claims := &Claims{
UserId: user.ID,
StandardClaims: jwt.StandardClaims{
ExpiresAt: expire.Unix(),
IssuedAt: time.Now().Unix(),
Issuer: "oceanlearn.tech",
Subject: "user token",
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenString, err = token.SignedString(jwtKey)
if err != nil {
return "", err
}
return
}
3、解析token
func ParseToken(tokenString string) (*jwt.Token, *Claims, error) {
claims := &Claims{}
token,err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
return jwtKey, nil
})
return token, claims, err
}
附:
var jwtKey = []byte("apple")
type Claims struct {
UserId int
jwt.StandardClaims
}
==============================手动分隔线====================
整个流程
1、用户输入账号密码发送到登录接口,若账号密码正确,则发放token,将此token返回给用户
2、用户后续每次请求,如访问个人信息接口,需要在请求头部加上此token
3、接口收到请求后,会判断token是否有效,若有效则解析token,找到用户id,从而获取用户信息
1、用户登录成功,发放token
token, err := common.ReleaseToken(user)
response.LoginSuccessfully(c, gin.H{"token":token})
2、用户请求头携带token
Authorization Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySWQiOjE2LCJleHAiOjE2MTEwNDEwNDIsImlhdCI6MTYxMDQzNjI0MiwiaXNzIjoib2NlYW5sZWFybi50ZWNoIiwic3ViIjoidXNlciB0b2tlbiJ9.DRdyspxB7iSUxrawN6QpMR_-SeW7U_FV4E0fMf7BjQI
3、中间件判断token是否有效,获取信息,将用户信息注入到 gin.Context 中
func CheckJWTLogin() gin.HandlerFunc {
return func(c *gin.Context) {
tokenString := c.GetHeader("Authorization")
if tokenString == "" || !strings.HasPrefix(tokenString, "Bearer "){
c.JSON(419, gin.H{"code":419, "msg":"unauthorized"})
c.Abort()
return
}
tokenString = tokenString[7:]
_, claims, err := common.ParseToken(tokenString)
if err != nil {
c.JSON(419, gin.H{"code":419, "msg": err.Error()})
c.Abort()
return
}
userId := claims.UserId
var user model.User
dao.DB.First(&user, userId)
c.Set("user", user)
c.Next()
}
}