token.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package token_model
  2. import (
  3. "fmt"
  4. "github.com/astaxie/beego"
  5. "github.com/dgrijalva/jwt-go"
  6. "time"
  7. )
  8. type JwtUser struct {
  9. Id int64 `json:"id"`
  10. }
  11. // JWT -- json web token
  12. // HEADER PAYLOAD SIGNATURE
  13. // This struct is the PAYLOAD
  14. type MyCustomClaims struct {
  15. JwtUser
  16. jwt.StandardClaims
  17. }
  18. //刷新jwt token
  19. func RefreshToken(tokenString string) (string, error) {
  20. // first get previous token
  21. token, err := jwt.ParseWithClaims(
  22. tokenString,
  23. &MyCustomClaims{},
  24. func(token *jwt.Token) (interface{}, error) {
  25. return []byte(KEY), nil
  26. })
  27. claims, ok := token.Claims.(*MyCustomClaims)
  28. if !ok || !token.Valid {
  29. return "", err
  30. }
  31. mySigningKey := []byte(KEY)
  32. expireAt := time.Now().Add(time.Second * time.Duration(DEFAULT_EXPIRE_SECONDS)).Unix()
  33. newClaims := MyCustomClaims{
  34. claims.JwtUser,
  35. jwt.StandardClaims{
  36. ExpiresAt: expireAt,
  37. Issuer: "",
  38. IssuedAt: time.Now().Unix(),
  39. },
  40. }
  41. // generate new token with new claims
  42. newToken := jwt.NewWithClaims(jwt.SigningMethodHS256, newClaims)
  43. tokenStr, err := newToken.SignedString(mySigningKey)
  44. if err != nil {
  45. beego.BeeLogger.Error("generate new fresh json web token failed !! error :%v", err)
  46. return "", err
  47. }
  48. return tokenStr, err
  49. }
  50. //验证jtw token
  51. func ValidateToken(tokenString string) (info JwtUser, err error) {
  52. token, err := jwt.ParseWithClaims(
  53. tokenString,
  54. &MyCustomClaims{},
  55. func(token *jwt.Token) (interface{}, error) {
  56. return []byte(KEY), nil
  57. })
  58. if claims, ok := token.Claims.(*MyCustomClaims); ok && token.Valid {
  59. //fmt.Printf("%v %v", claims.User, claims.StandardClaims.ExpiresAt)
  60. //fmt.Println("token will be expired at ", time.Unix(claims.StandardClaims.ExpiresAt, 0))
  61. info = claims.JwtUser
  62. } else {
  63. beego.BeeLogger.Error("validate tokenString failed !!!:%v", err)
  64. }
  65. return info, err
  66. }
  67. //获取jwt token
  68. func GenerateToken(info *JwtUser, expiredSeconds int) (tokenString string, err error) {
  69. if expiredSeconds == 0 {
  70. expiredSeconds = DEFAULT_EXPIRE_SECONDS
  71. }
  72. // Create the Claims
  73. mySigningKey := []byte(KEY)
  74. expireAt := time.Now().Add(time.Second * time.Duration(expiredSeconds)).Unix()
  75. beego.BeeLogger.Warn("token will be expired at %v ", time.Unix(expireAt, 0))
  76. // pass parameter to this func or not
  77. user := *info
  78. claims := MyCustomClaims{
  79. user,
  80. jwt.StandardClaims{
  81. ExpiresAt: expireAt,
  82. Issuer: "",
  83. IssuedAt: time.Now().Unix(),
  84. },
  85. }
  86. token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  87. tokenStr, err := token.SignedString(mySigningKey)
  88. if err != nil {
  89. beego.BeeLogger.Error("generate json web token failed !! error : %v", err)
  90. } else {
  91. tokenString = tokenStr
  92. }
  93. return
  94. }
  95. // return this result to client then all later request should have header "Authorization: Bearer <token> "
  96. func getHeaderTokenValue(tokenString string) string {
  97. //Authorization: Bearer <token>
  98. return fmt.Sprintf("Bearer %s", tokenString)
  99. }