rsa.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package utils
  2. import (
  3. "crypto/rsa"
  4. "errors"
  5. "github.com/dgrijalva/jwt-go"
  6. "io/ioutil"
  7. )
  8. type PemKEY struct {
  9. PublicKey *rsa.PublicKey
  10. }
  11. func getPEM(path string) (key PemKEY, err error) {
  12. pubByte, err := ioutil.ReadFile(path)
  13. if err != nil {
  14. return key, err
  15. }
  16. key.PublicKey, err = jwt.ParseRSAPublicKeyFromPEM(pubByte)
  17. if err != nil {
  18. return key, err
  19. }
  20. return key, nil
  21. }
  22. func RSADeToken(token, path string, NewClaim jwt.Claims) error {
  23. if token == "" {
  24. return errors.New("token为空")
  25. }
  26. key, err := getPEM(path)
  27. if err != nil {
  28. return err
  29. }
  30. tokens, err := jwt.ParseWithClaims(token, NewClaim, func(token *jwt.Token) (interface{}, error) {
  31. return key.PublicKey, nil
  32. })
  33. if !tokens.Valid {
  34. if ve, ok := err.(*jwt.ValidationError); ok { //官方写法招抄就行
  35. if ve.Errors&jwt.ValidationErrorMalformed != 0 {
  36. return errors.New("错误的token")
  37. } else if ve.Errors&(jwt.ValidationErrorExpired|jwt.ValidationErrorNotValidYet) != 0 {
  38. return errors.New("token过期或未启用")
  39. } else {
  40. return errors.New("无法处理这个token" + err.Error())
  41. }
  42. }
  43. }
  44. return nil
  45. }