jwt.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package jwt
  2. import (
  3. "crypto/rsa"
  4. "fmt"
  5. "time"
  6. "github.com/dgrijalva/jwt-go"
  7. )
  8. type JWTTokenGenerate struct {
  9. privateKey *rsa.PrivateKey
  10. issuer string
  11. nowFunc func() time.Time
  12. }
  13. func NewJWTTokenGen(issuer string, privateKey *rsa.PrivateKey) *JWTTokenGenerate {
  14. return &JWTTokenGenerate{
  15. privateKey: privateKey,
  16. issuer: issuer,
  17. nowFunc: time.Now,
  18. }
  19. }
  20. func (j *JWTTokenGenerate) GenerateToken(username string, expireTime int) (string, error) {
  21. nowTime := j.nowFunc().Unix()
  22. token := jwt.NewWithClaims(jwt.SigningMethodRS512, jwt.StandardClaims{
  23. Issuer: j.issuer,
  24. IssuedAt: nowTime,
  25. ExpiresAt: nowTime + int64(expireTime),
  26. Subject: username,
  27. })
  28. return token.SignedString(j.privateKey)
  29. }
  30. // JWTTokenVerifier 校验token
  31. type JWTTokenVerifier struct {
  32. PublicKey *rsa.PublicKey
  33. }
  34. func (v *JWTTokenVerifier) ParseToken(token string) (string, error) {
  35. // 自定义字段许使用 jwt.MapClaims{},这里没有定义其他字段,就用jwt.StandardClaims
  36. jwtToken, err := jwt.ParseWithClaims(token, &jwt.StandardClaims{}, func(token *jwt.Token) (interface{}, error) {
  37. return v.PublicKey, nil
  38. })
  39. if err != nil {
  40. return "", err
  41. }
  42. if !jwtToken.Valid {
  43. return "", fmt.Errorf("token not valid")
  44. }
  45. // 判断类型
  46. clm, ok := jwtToken.Claims.(*jwt.StandardClaims)
  47. if !ok {
  48. return "", fmt.Errorf("token claim is not StandardClaims")
  49. }
  50. if err = clm.Valid(); err != nil {
  51. return "", fmt.Errorf("claim not valid: %v", err)
  52. }
  53. return clm.Subject, nil
  54. }