jwt_rsa.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package jwt
  2. import (
  3. "errors"
  4. "fmt"
  5. "time"
  6. "github.com/golang-jwt/jwt"
  7. )
  8. const ExpireTimeMinutes = 10
  9. type Token struct {
  10. jwt.StandardClaims
  11. }
  12. type ErrorType int8
  13. const (
  14. JWT_VALIDATE_ERROR ErrorType = 1
  15. )
  16. const (
  17. JWT_VALIDATE_TEMP = "JWTVAL__ERRCODE:%d__ERRSTR:%s__TOKEN:%s"
  18. JWT_OTHER_TEMP = "JWTOTH__ERRSTR:%s__TOKEN:%s"
  19. )
  20. type Error struct {
  21. errType ErrorType
  22. Inner error
  23. metaToken string
  24. }
  25. func (e Error) Error() string {
  26. switch e.errType {
  27. case JWT_VALIDATE_ERROR:
  28. if ve, ok := e.Inner.(*jwt.ValidationError); ok {
  29. return fmt.Sprintf(JWT_VALIDATE_TEMP, ve.Errors, ve.Error(), e.metaToken)
  30. }
  31. default:
  32. return fmt.Sprintf(JWT_OTHER_TEMP, e.Inner.Error(), e.metaToken)
  33. }
  34. return "Invalid token " + e.metaToken
  35. }
  36. func CreateToken(signKeyName, issuer, aud string) (string, error) {
  37. tk := &Token{}
  38. tk.Issuer = issuer
  39. tk.Audience = aud
  40. tk.ExpiresAt = time.Now().Add(time.Duration(ExpireTimeMinutes) * time.Minute).Unix()
  41. token := jwt.NewWithClaims(jwt.GetSigningMethod("RS256"), tk)
  42. signKey, err := GetPrivateKeyWithKeyName(signKeyName)
  43. if err != nil {
  44. return "", err
  45. }
  46. return token.SignedString(signKey)
  47. }
  48. func ParseToken(th string) (*Token, error) {
  49. tk := &Token{}
  50. token, err := jwt.ParseWithClaims(th, tk, func(token *jwt.Token) (interface{}, error) {
  51. jwtToken := token.Claims.(*Token)
  52. if jwtToken.Issuer == "" {
  53. return "", fmt.Errorf("issuer field not exist in jwt payload")
  54. }
  55. pubKey, err := GetPublicKey(jwtToken.Issuer)
  56. if err != nil {
  57. return "", err
  58. }
  59. return pubKey, nil
  60. })
  61. if ve, ok := err.(*jwt.ValidationError); ok {
  62. return tk, Error{
  63. errType: JWT_VALIDATE_ERROR,
  64. Inner: ve,
  65. metaToken: th,
  66. }
  67. }
  68. if err != nil {
  69. return nil, err
  70. }
  71. if !token.Valid {
  72. return nil, errors.New("invalid token")
  73. }
  74. return tk, nil
  75. }