1. 程式人生 > 程式設計 >JWT程式碼實現

JWT程式碼實現

在Go中可以直接使用github.com/dgrijalva/jwt-go簡單實現Token的生成和有效性檢驗。 如果存在私密的檔案,則需要使用使用密碼對稱加密。jwt生成的token在沒有加密的情況下,需要使用https傳輸資料,確保資料安全。 更多請參考:JSON Web Token 入門教程

下面是程式碼實現:

package main

import (
	"errors"
	"fmt"
	"log"
	"time"

	"github.com/dgrijalva/jwt-go"
)

type UserInfo struct {
	ID uint64
	Username string
}

const
SecrectStr string ="hello world" func CreateToken(user *UserInfo)(tokenss string,err error){ //自定義claim claim := jwt.MapClaims{ "id": user.ID,"username": user.Username,"nbf": time.Now().Unix(),"iat": time.Now().Unix(),} token := jwt.NewWithClaims(jwt.SigningMethodHS256,claim) // 簽名後的token格式說明
// 示例:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1NzUyODUyNzUsImlkIjoxLCJuYmYiOjE1NzUyODUyNzUsInVzZXJuYW1lIjoicGVuZ2oifQ.bDe8UZYLxvmrK7gHcuK8TrlnoiMsIm3Jo_f0-YYle7E // 使用符號.,被分割成了三段 // 第一段base64解碼之後:{"alg":"HS256","typ":"JWT"} // 第二段base64解碼之後:{"iat":1575285275,"id":1,"nbf":1575285275,"username":"pengj"},是原始的資料。
// 第三段是使用SigningMethodHS256加密之後的文字 tokenss,err = token.SignedString([]byte(SecrectStr)) return } func secret()jwt.Keyfunc{ return func(token *jwt.Token) (i interface{},e error) { return []byte(SecrectStr),nil return i,e } } func ParseToken(tokenss string)(user *UserInfo,err error){ user = &UserInfo{} token,err := jwt.Parse(tokenss,secret()) if err != nil{ return } claim,ok := token.Claims.(jwt.MapClaims) if !ok{ err = errors.New("cannot convert claim to mapclaim") return } //驗證token,如果token被修改過則為false if !token.Valid{ err = errors.New("token is invalid") return } user.ID =uint64(claim["id"].(float64)) user.Username = claim["username"].(string) return } func main(){ user := UserInfo{ID:1,Username: "pengj"} tokenStr,err := CreateToken(&user) if err != nil { panic(err) } log.Println("tokenStr:",tokenStr) u,err := ParseToken(tokenStr) if err != nil { panic(err) } fmt.Println(u.ID,u.Username) } 複製程式碼