token.go 2.3 KB

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