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)
        }
    
    }
    





  • 相关阅读:
    MyEclipse错误积累--持续更新
    Git错误积累-持续更新
    MySQL错误积累-持续更新
    评价一个人,就是要看他把时间都花在哪了
    收集的yum命令博文
    Github 常用命令
    python库收藏
    [转载]Scikit Learn: 在python中机器学习
    Windows下python安装Matplotlib、Numpy和Scipy模块
    [LeetCode] #45 Jump Game II
  • 原文地址:https://www.cnblogs.com/hualou/p/12091043.html
Copyright © 2011-2022 走看看