您的位置 首页 php

Go Web教程25:Gin 使用JWT Token验证会话

实现步骤

1.用户登录成功后,生成JWT Token

2.把Token存入 redis

3.用户访问需要授权的信息,从Header中获取Token与Redis中Token进行对比

4.解析Token,获取到UserId

引入jwt-go 三方包

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

生成JWT Token

func NewToken(userId string) string {
 token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
 constant.USER_ID: userId,
 "exp": time.Now().Add(constant.TimeOut). Unix (),
 "nbf": time.Now().Unix(),
 })
 tokenString, err := token.SignedString([] byte (constant.KEY))
 if err !=  nil  {
 return ""
 }
 return tokenString
}
 

Redis保存Token

keyUser := constant.REDIS_USER_TOKEN + "1"
err3 := redis.RedisCli.Set(keyUser, token, 0).Err()
if err3 != nil {
 panic(err3)
}
 

Token验证

func CheckToken() gin.HandlerFunc {
 return func(c *gin.Context) {
 tokenStr := c. Request .Header.Get(constant.TOKEN_NAME)
 token, err := jwt.Parse(tokenStr, func(token *jwt.Token) (interface{}, error) {
 return []byte(constant.KEY), nil
 })
 if err != nil {
 fmt.Println(err)
 c.AbortWithStatus(http.StatusUnauthorized)
 return
 } else {
 if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid {
 userId := claims[constant.USER_ID].(string)
 //Redis 获取Token
 keyUser := constant.REDIS_USER_TOKEN + userId
 token, err := redis.RedisCli.Get(keyUser).Result()
 if err != nil {
 c.AbortWithStatus(http.StatusUnauthorized)
 return
 }
 if strings.EqualFold(token, tokenStr) {
 c.Request.Header.Set(constant.USER_ID, userId)
 } else {
 c.AbortWithStatus(http.StatusUnauthorized)
 return
 }
 }
 }
 c.Next()
 }
}

 

如果你觉得好,可以使用我开发的APP,已经发布到iOS APP Store

  1. 人脉管理
  2. 学习管理
  3. 爱背单词
  4. 房产管理
  5. 物品管理
  6. 团队管理
  7. 证书管理
  8. 专利管理
  9. 资产管理8
  10. 密码提示管理

文章来源:智云一二三科技

文章标题:Go Web教程25:Gin 使用JWT Token验证会话

文章地址:https://www.zhihuclub.com/79618.shtml

关于作者: 智云科技

热门文章

网站地图