claims.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package claims
  2. import (
  3. "errors"
  4. "github.com/dgrijalva/jwt-go"
  5. "time"
  6. )
  7. type MyClaims struct {
  8. Id int `json:"id"`
  9. Username string `json:"username"`
  10. Sid string `json:"sid"`
  11. Role []string `json:"role"`
  12. jwt.StandardClaims
  13. }
  14. const TokenExpireDuration = time.Hour * 24
  15. var MySecret = []byte("fasdge[wkejk@$gagli")
  16. // GenToken 生成JWT
  17. func GenToken(id int, username, sid string, roleName []string) (string, error) {
  18. // 创建一个我们自己的声明
  19. c := MyClaims{
  20. Id: id,
  21. Username: username, // 自定义字段
  22. Sid: sid,
  23. Role: roleName,
  24. StandardClaims: jwt.StandardClaims{
  25. ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(), // 过期时间
  26. Issuer: "my-project", // 签发人
  27. },
  28. }
  29. // 使用指定的签名方法创建签名对象
  30. token := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
  31. // 使用指定的secret签名并获得完整的编码后的字符串token
  32. return token.SignedString(MySecret)
  33. }
  34. // ParseToken 解析JWT
  35. func ParseToken(tokenString string) (*MyClaims, error) {
  36. // 解析token
  37. token, err := jwt.ParseWithClaims(tokenString, &MyClaims{}, func(token *jwt.Token) (i interface{}, err error) {
  38. return MySecret, nil
  39. })
  40. if err != nil {
  41. return nil, err
  42. }
  43. if claims, ok := token.Claims.(*MyClaims); ok && token.Valid { // 校验token
  44. return claims, nil
  45. }
  46. return nil, errors.New("invalid token")
  47. }