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