123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- package utils
- import (
- "crypto/rsa"
- "errors"
- "github.com/dgrijalva/jwt-go"
- "io/ioutil"
- )
- type PemKEY struct {
- PublicKey *rsa.PublicKey
- }
- func getPEM(path string) (key PemKEY, err error) {
- pubByte, err := ioutil.ReadFile(path)
- if err != nil {
- return key, err
- }
- key.PublicKey, err = jwt.ParseRSAPublicKeyFromPEM(pubByte)
- if err != nil {
- return key, err
- }
- return key, nil
- }
- func RSADeToken(token, path string, NewClaim jwt.Claims) error {
- if token == "" {
- return errors.New("token为空")
- }
- key, err := getPEM(path)
- if err != nil {
- return err
- }
- tokens, err := jwt.ParseWithClaims(token, NewClaim, func(token *jwt.Token) (interface{}, error) {
- return key.PublicKey, nil
- })
- if !tokens.Valid {
- if ve, ok := err.(*jwt.ValidationError); ok { //官方写法招抄就行
- if ve.Errors&jwt.ValidationErrorMalformed != 0 {
- return errors.New("错误的token")
- } else if ve.Errors&(jwt.ValidationErrorExpired|jwt.ValidationErrorNotValidYet) != 0 {
- return errors.New("token过期或未启用")
- } else {
- return errors.New("无法处理这个token" + err.Error())
- }
- }
- }
- return nil
- }
|