golang 使用jwt-go生成token、解析token
阿新 • • 發佈:2022-06-01
程式碼:
package main import ( "fmt" "github.com/dgrijalva/jwt-go" "time" ) func main() { token, _ := GenerateToken("user", "password") fmt.Println("token:", token) claim, _ := ParseToken(token) fmt.Println(claim) } var jwtSecret=[]byte("setting.JwtSecret") //Claim是一些實體(通常指的使用者)的狀態和額外的元資料 type Claims struct{ Username string `json:"username"` Password string `json:"password"` jwt.StandardClaims } // 根據使用者的使用者名稱和密碼產生token func GenerateToken(username ,password string)(string,error){ //設定token有效時間 nowTime:=time.Now() expireTime:=nowTime.Add(3*time.Hour) claims:=Claims{ Username: username, Password: password, StandardClaims: jwt.StandardClaims{ // 過期時間 ExpiresAt:expireTime.Unix(), // 指定token發行人 Issuer:"gin-blog", }, } tokenClaims:=jwt.NewWithClaims(jwt.SigningMethodHS256,claims) //該方法內部生成簽名字串,再用於獲取完整、已簽名的token token,err:=tokenClaims.SignedString(jwtSecret) return token,err } // 根據傳入的token值獲取到Claims物件資訊,(進而獲取其中的使用者名稱和密碼) func ParseToken(token string)(*Claims,error){ //用於解析鑑權的宣告,方法內部主要是具體的解碼和校驗的過程,最終返回*Token tokenClaims, err := jwt.ParseWithClaims(token, &Claims{}, func(token *jwt.Token) (interface{}, error) { return jwtSecret, nil }) if tokenClaims!=nil{ // 從tokenClaims中獲取到Claims物件,並使用斷言,將該物件轉換為我們自己定義的Claims // 要傳入指標,專案中結構體都是用指標傳遞,節省空間。 if claims,ok:=tokenClaims.Claims.(*Claims);ok&&tokenClaims.Valid{ return claims,nil } } return nil,err }