jwt_rsa.go 1.8 KB

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