token.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package token
  2. import (
  3. "errors"
  4. "github.com/dgrijalva/jwt-go"
  5. "github.com/google/uuid"
  6. "time"
  7. )
  8. var JwtClaims = new(jwtClaims)
  9. // JwtClaims 创建自己的Claims
  10. type jwtClaims struct {
  11. *jwt.StandardClaims
  12. //用户编号
  13. ID string
  14. SysUserName string
  15. UUID uuid.UUID
  16. Time time.Time
  17. }
  18. var (
  19. //盐
  20. secret = []byte("6MTY2MDcxMjgzNiwi") // 后续加密增加盐增加复杂度
  21. TokenExpired error = errors.New("Token is expired") // token错误类型提炼
  22. TokenNotValidYet error = errors.New("Token not active yet") // token错误类型提炼
  23. TokenMalformed error = errors.New("That's not even a token") // token错误类型提炼
  24. TokenInvalid error = errors.New("Couldn't handle this token:") // token错误类型提炼
  25. )
  26. // CreateJwtToken 生成一个jwttoken
  27. func (jwtClaims) CreateJwtToken(id, userName string, uuid uuid.UUID, ti time.Duration) (string, error) {
  28. // 定义过期时间
  29. expireToken := time.Now().Add(time.Hour * ti).Unix()
  30. claims := jwtClaims{
  31. &jwt.StandardClaims{
  32. NotBefore: int64(time.Now().Unix() - 1000), // token信息生效时间
  33. ExpiresAt: expireToken, // 过期时间0=永不过期
  34. Issuer: "lc_veterans", // 发布者
  35. },
  36. id,
  37. userName,
  38. uuid,
  39. time.Now(),
  40. }
  41. // 对自定义claims加密,jwt.SigningMethodHS256是加密算法得到第二部分
  42. token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  43. // 给这个token盐加密 第三部分,得到一个完整的三段的加密
  44. signedToken, err := token.SignedString(secret)
  45. if err != nil {
  46. return "", err
  47. }
  48. return signedToken, nil
  49. }
  50. // ParseJwtToken 解析token得到是自己创建的Claims
  51. func (jwtClaims) ParseJwtToken(jwtToken string) (*jwtClaims, error) {
  52. var jwtclaim = &jwtClaims{}
  53. _, err := jwt.ParseWithClaims(jwtToken, jwtclaim, func(*jwt.Token) (interface{}, error) {
  54. //得到盐
  55. return secret, nil
  56. })
  57. if err != nil {
  58. if ve, ok := err.(*jwt.ValidationError); ok {
  59. if ve.Errors&jwt.ValidationErrorMalformed != 0 {
  60. return nil, TokenMalformed
  61. } else if ve.Errors&jwt.ValidationErrorExpired != 0 {
  62. // Token is expired
  63. return nil, TokenExpired
  64. } else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 {
  65. return nil, TokenNotValidYet
  66. } else {
  67. return nil, TokenInvalid
  68. }
  69. }
  70. }
  71. return jwtclaim, nil
  72. }