<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      golang 中 Jwt 的驗(yàn)證及續(xù)期使用

      創(chuàng)建Utils的Jwt文件,用于創(chuàng)建Jwt Token  和    驗(yàn)證并繼期

      package utils
      
      import (
          "errors"
          "fmt"
          "github.com/dgrijalva/jwt-go"
          "strings"
          "time"
      )
      
      // 生成Jwt Token
      // @Param  secretKey 表示jwt secretKey【*******注意:發(fā)布多臺(tái)時(shí)secretKey 必須一樣*********】
      // @Result  string 創(chuàng)建的Token
      // @Result  error 返回驗(yàn)證錯(cuò)誤信息
      
      func GenerateJWTToken() (string, error) {
          // secretKey 表示jwt 的secretKey【*******注意:發(fā)布多臺(tái)時(shí)secretKey 必須一樣,否則通不過(guò)驗(yàn)證*********】
          // 獲取 ini 文件配置的 Jwt SecretKey
          var secretKey = GetIniVale("jwt", "SecretKey")
          claims := jwt.MapClaims{
              "sub":  "1234567890",
              "name": "John Doe",
              "iat":  time.Now().Unix(),
              "exp":  time.Now().Add(time.Minute * 3).Unix(),
          }
          // 使用指定的簽名方法和密鑰創(chuàng)建令牌
          token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
          tokenString, err := token.SignedString([]byte(secretKey))
          if err != nil {
              return "", err
          }
          return tokenString, nil
      }
      
      // 驗(yàn)證Jwt token  并且如果Token快過(guò)期,就創(chuàng)建新的token
      // @Param  tokenString 表示jwt token
      // @Result  bool 驗(yàn)證是否通過(guò)
      // @Result  string 快過(guò)期創(chuàng)建新的Token,沒(méi)有則為空
      // @Result  error 返回驗(yàn)證錯(cuò)誤信息
      
      func ValidateJWTToken(tokenString string) (bool, string, error) {
          // secretKey 表示jwt 的secretKey【*******注意:發(fā)布多臺(tái)時(shí)secretKey 必須一樣,否則通不過(guò)驗(yàn)證*********】
          // 獲取 ini 文件配置的 Jwt SecretKey
          var secretKey = GetIniVale("jwt", "SecretKey")
          tokenString = strings.TrimPrefix(tokenString, "Bearer ")
          token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
              return []byte(secretKey), nil
          })
          if err != nil {
              return false, "", err
          }
          claims, ok := token.Claims.(jwt.MapClaims)
          // token 驗(yàn)證
          if ok && token.Valid {
              // Token是否過(guò)期
              if !claims.VerifyExpiresAt(time.Now().Unix(), false) {
                  return false, "", errors.New("access token expired")
              }
              // 一分鐘過(guò)期就重新添加一個(gè)Token 返回給前端
              if !claims.VerifyExpiresAt(time.Now().Add(time.Minute).Unix(), false) {
                  newToken, _ := GenerateJWTToken()
                  return true, newToken, nil
              }
              return true, "", nil
          } else {
              return false, "", fmt.Errorf("Invalid token")
          }
      }

      編寫登錄創(chuàng)建jwt token

      package controller
      
      import (
          "github.com/gin-gonic/gin"
          "jwt/utils"
      )
      
      type UserController struct{}
      
      func (u UserController) Login(c *gin.Context) {
          userName := c.Query("userName")
          pwd := c.Query("password")
          if userName == "zs" && pwd == "123" {
              // 登錄成功  生成Jwt Token
              token, err := utils.GenerateJWTToken()
              if err != nil {
                  c.JSON(500, gin.H{"Msg": "生成Token失敗:" + err.Error()})
              } else {
                  c.JSON(200, gin.H{"Token": token})
              }
          } else {
              c.JSON(500, gin.H{"Msg": "用戶中或密碼錯(cuò)誤!"})
          }
      }

      在gin 中 添加中間件,用于驗(yàn)證 token

      package middleware
      
      import (
          "github.com/gin-gonic/gin"
          "jwt/utils"
          "strings"
      )
      
      func ValidataToken() gin.HandlerFunc {
          return func(c *gin.Context) {    // 判斷 是不是登錄鏈接,如果是直接往下走
              if strings.Contains(strings.ToLower(c.Request.RequestURI), "/user/login") {
                  c.Next()
              } else {
                  token := c.GetHeader("Authorization")
                  // 驗(yàn)證token  并且如果 Token快過(guò)期 就創(chuàng)建新的token
                  bls, newToken, err := utils.ValidateJWTToken(token)
                  if err != nil {
                      c.JSON(500, gin.H{
                          "msg": err.Error(),
                      })
                      c.Abort()
                      return
                  } else {
                      if bls {
                          // 是否有快過(guò)期創(chuàng)建新的Token
                          if len(newToken) > 0 {
                              c.Header("newToken", newToken) // 將新Token添加到返回的Header里,方便前端使用
                          }
                          c.Next()
                      } else {
                          c.JSON(401, gin.H{"msg": "token not validated"})
                          c.Abort()
                          return
                      }
                  }
              }
      
          }
      }

      gin 中use中間件

      package main
      
      import (
          "github.com/gin-gonic/gin"
          "jwt/middleware"
          "jwt/route"
      )
      
      func main() {
          r := gin.Default()
          r.Use(middleware.ValidataToken())
          route.AddUserInfoRoute(r)
          r.Run(":8080")
      }

       

      posted @ 2024-07-04 18:52  酒沉吟  閱讀(484)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 亚洲一区二区三区在线观看精品中文 | 婷婷六月天在线| 久热这里只有精品视频3| 久久综合色天天久久综合图片| 西畴县| 久草热大美女黄色片免费看| 东京热一精品无码av| 鲁大师在线视频播放免费观看| 国产极品粉嫩尤物一线天| 亚洲精品色哟哟一区二区| 欧美老少配性行为| 婷婷四虎东京热无码群交双飞视频| 日韩中文字幕有码午夜美女| 丰满少妇在线观看网站| 午夜AAAAA级岛国福利在线| 91国内精品久久精品一本| 国产旡码高清一区二区三区| 久久亚洲精品中文字幕波多野结衣| 亚洲成人四虎在线播放| 国产白丝jk捆绑束缚调教视频| 日韩国产精品无码一区二区三区| 99久久精品费精品国产一区二| 久久国产精品日本波多野结衣| 国产精品视频午夜福利| 人妻中文字幕亚洲一区| 呈贡县| 国产精品一区二区三区黄 | 色老头亚洲成人免费影院| 老色鬼在线精品视频在线观看| 亚洲精品自拍视频在线看| 色综合天天综合天天综| 亚洲成熟女人av在线观看| 国产亚洲精品中文字幕| 亚洲日本欧美日韩中文字幕| 亚洲综合久久精品哦夜夜嗨| 亚洲午夜性猛春交XXXX| 亚洲国产另类久久久精品| yw尤物av无码国产在线观看| 鲁鲁网亚洲站内射污| 亚洲熟妇精品一区二区| 精品久久精品久久精品九九|