jwt-go(Json web token)之ecdsa(橢圓曲線)方法

代碼示例:

package main

import (
	"crypto/ecdsa"
	"crypto/elliptic"
	"crypto/rand"
	"errors"
	"fmt"
	"github.com/dgrijalva/jwt-go"
	"time"
)

var privateKey  *ecdsa.PrivateKey
type Claims struct {
	UserId uint
	jwt.StandardClaims
}
func main() {
	var err error
	privateKey, _, err= getEcdsaKey(2) //生成橢圓曲線的私鑰
	if err!=nil {
		fmt.Println("getEcdsaKey is error!",err)
		return
	}
	token, err := ReleaseToken(privateKey)
	if err!=nil {
		fmt.Println("生成token錯誤:",err)
		return
	}
	fmt.Println("生成的token爲:",token)
	parseToken, claims, err := ParseToken(token,privateKey)
	//fmt.Println(privateKey)
	fmt.Println(parseToken,claims,err)
	userId := claims.UserId
	if userId!=001 { //001爲數據庫中的數據,表示分發給某一用戶的Id
		fmt.Println("權限不足!")
		return
	}
	fmt.Println("驗證通過!")
}
//生成token
func ReleaseToken(key *ecdsa.PrivateKey) (string,error) {
	expirationTime := time.Now().Add(7 * 24 * time.Hour) //截止時間:從當前時刻算起,7天
	claims := &Claims{
		UserId:        001, //分發給某一用戶的token,模擬數據爲 001
		StandardClaims: jwt.StandardClaims{
			ExpiresAt: expirationTime.Unix(), //過期時間
			IssuedAt: time.Now().Unix(), //發佈時間
			Issuer: "jiangzhou", //發佈者
			Subject: "user token", //主題
		},
	}
	token := jwt.NewWithClaims(jwt.SigningMethodES256, claims) //生成token
	tokenString, err := token.SignedString(key) //簽名
	if err!=nil {
		fmt.Println("生成token錯誤:",err)
		return "", err
	}
	//fmt.Println("token:",tokenString)
	return tokenString,err
}
//解析token
func ParseToken(tokenString string,key *ecdsa.PrivateKey) (*jwt.Token, *Claims, error){
	claims := &Claims{}
	token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (i interface{}, err error) {
		token.Method=jwt.SigningMethodES256
		return key, nil
	})
	return token, claims, err
}
func getEcdsaKey(length int) (*ecdsa.PrivateKey, ecdsa.PublicKey, error){
	var err error
	var prk *ecdsa.PrivateKey
	var puk ecdsa.PublicKey
	var curve elliptic.Curve
	switch length {
	case 1:
		curve = elliptic.P224()
	case 2:
		curve = elliptic.P256()
	case 3:
		curve = elliptic.P384()
	case 4:
		curve = elliptic.P521()
	default:
		err =errors.New("輸入的簽名等級錯誤!")
	}
	prk, err = ecdsa.GenerateKey(curve,rand.Reader) //通過 "crypto/rand" 模塊產生的隨機數生成私鑰
	if err != nil {
		return prk, puk, err
	}
	puk = prk.PublicKey
	return prk, puk, err
}

運行效果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章