| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 | 
							- package jwt
 
- import (
 
- 	"crypto/rsa"
 
- 	"fmt"
 
- 	"time"
 
- 	"github.com/dgrijalva/jwt-go"
 
- )
 
- type JWTTokenGenerate struct {
 
- 	privateKey *rsa.PrivateKey
 
- 	issuer     string
 
- 	nowFunc    func() time.Time
 
- }
 
- func NewJWTTokenGen(issuer string, privateKey *rsa.PrivateKey) *JWTTokenGenerate {
 
- 	return &JWTTokenGenerate{
 
- 		privateKey: privateKey,
 
- 		issuer:     issuer,
 
- 		nowFunc:    time.Now,
 
- 	}
 
- }
 
- func (j *JWTTokenGenerate) GenerateToken(username string, expireTime int) (string, error) {
 
- 	nowTime := j.nowFunc().Unix()
 
- 	token := jwt.NewWithClaims(jwt.SigningMethodRS512, jwt.StandardClaims{
 
- 		Issuer:    j.issuer,
 
- 		IssuedAt:  nowTime,
 
- 		ExpiresAt: nowTime + int64(expireTime),
 
- 		Subject:   username,
 
- 	})
 
- 	return token.SignedString(j.privateKey)
 
- }
 
- // JWTTokenVerifier 校验token
 
- type JWTTokenVerifier struct {
 
- 	PublicKey *rsa.PublicKey
 
- }
 
- func (v *JWTTokenVerifier) ParseToken(token string) (string, error) {
 
- 	// 自定义字段许使用  jwt.MapClaims{},这里没有定义其他字段,就用jwt.StandardClaims
 
- 	jwtToken, err := jwt.ParseWithClaims(token, &jwt.StandardClaims{}, func(token *jwt.Token) (interface{}, error) {
 
- 		return v.PublicKey, nil
 
- 	})
 
- 	if err != nil {
 
- 		return "", err
 
- 	}
 
- 	if !jwtToken.Valid {
 
- 		return "", fmt.Errorf("token not valid")
 
- 	}
 
- 	// 判断类型
 
- 	clm, ok := jwtToken.Claims.(*jwt.StandardClaims)
 
- 	if !ok {
 
- 		return "", fmt.Errorf("token claim is not StandardClaims")
 
- 	}
 
- 	if err = clm.Valid(); err != nil {
 
- 		return "", fmt.Errorf("claim not valid: %v", err)
 
- 	}
 
- 	return clm.Subject, nil
 
- }
 
 
  |