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

}






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM