zoukankan      html  css  js  c++  java
  • 29.Jwt集成(3):token设置过期时间、异常判断

    token设置过期时间

    package main
    
    import (
        "fmt"
        "github.com/dgrijalva/jwt-go"
        "io/ioutil"
        "log"
        "time"
    )
    
    type UserClaim struct {
        Uname              string `json:"username"`
        jwt.StandardClaims        //嵌套了这个结构体就实现了Claim接口
    }
    
    func main() {
        priBytes, err := ioutil.ReadFile("./pem/private.pem")
        if err != nil {
            log.Fatal("私钥文件读取失败")
        }
    
        pubBytes, err := ioutil.ReadFile("./pem/public.pem")
        if err != nil {
            log.Fatal("公钥文件读取失败")
        }
        pubKey, err := jwt.ParseRSAPublicKeyFromPEM(pubBytes)
        if err != nil {
            log.Fatal("公钥文件不正确")
        }
    
        priKey, err := jwt.ParseRSAPrivateKeyFromPEM(priBytes)
        if err != nil {
            log.Fatal("私钥文件不正确")
        }
        user := UserClaim{Uname: "xiahualou"}
        user.ExpiresAt = time.Now().Add(time.Second * 5).Unix()      //UserClaim嵌套了jwt.StandardClaims,使用它的Add方法添加过期时间是5秒后,这里要使用unix()
        token_obj := jwt.NewWithClaims(jwt.SigningMethodRS256, user) //所有人给xiahualou发送公钥加密的数据,但是只有xiahualou本人可以使用私钥解密
        token, _ := token_obj.SignedString(priKey)
         //通过一秒一次for循环来验证过期生效
        for {
            uc := UserClaim{}
            getToken, err := jwt.ParseWithClaims(token, &uc, func(token *jwt.Token) (i interface{}, e error) { //使用私钥解密
                return pubKey, nil //这里的返回值必须是公钥,不然解密肯定是失败
            })
            if getToken.Valid { //服务端验证token是否有效
                fmt.Println(getToken.Claims.(*UserClaim).Uname)
            } else if ve, ok := err.(*jwt.ValidationError); ok { //官方写法招抄就行
                if ve.Errors&jwt.ValidationErrorMalformed != 0 {
                    fmt.Println("错误的token")
                } else if ve.Errors&(jwt.ValidationErrorExpired|jwt.ValidationErrorNotValidYet) != 0 {
                    fmt.Println("token过期或未启用")
                } else {
                    fmt.Println("无法处理这个token", err)
                }
    
            }
            time.Sleep(time.Second)
        }
    
    }
    





  • 相关阅读:
    204. Count Primes (Integer)
    203. Remove Linked List Elements (List)
    202. Happy Number (INT)
    201. Bitwise AND of Numbers Range (Bit)
    200. Number of Islands (Graph)
    199. Binary Tree Right Side View (Tree, Stack)
    198. House Robber(Array; DP)
    191. Number of 1 Bits (Int; Bit)
    190. Reverse Bits (Int; Bit)
    189. Rotate Array(Array)
  • 原文地址:https://www.cnblogs.com/hualou/p/12091043.html
Copyright © 2011-2022 走看看