29.Jwt Integration (3): token expiration time setting, abnormality determination

token set an expiration time

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

}





Guess you like

Origin www.cnblogs.com/hualou/p/12091043.html