jwt.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package middleware
  2. import (
  3. "DataShare/global"
  4. "DataShare/model"
  5. "errors"
  6. "fmt"
  7. "github.com/dgrijalva/jwt-go"
  8. "github.com/twinj/uuid"
  9. "net/http"
  10. "time"
  11. )
  12. func CreateToken(appid string,appSecret string) (*model.TokenDetails, error) {
  13. td := &model.TokenDetails{}
  14. tokenExpire := global.SystemConfig.Redis.Cache.TokenExpire
  15. td.AtExpires = time.Now().Add(time.Second * time.Duration(tokenExpire)).Unix() //expires after 30 min
  16. td.TokenUuid = "uuid_"+uuid.NewV4().String()
  17. //td.RtExpires = time.Now().Add(time.Hour * 24 * 7).Unix()
  18. //td.RefreshUuid = td.TokenUuid + "++" + userId
  19. var err error
  20. //Creating Access Token
  21. atClaims := jwt.MapClaims{}
  22. atClaims["access_uuid"] = td.TokenUuid
  23. atClaims["appId"] = appid //账号
  24. atClaims["appSecret"] = appSecret //账号
  25. atClaims["exp"] = td.AtExpires
  26. at := jwt.NewWithClaims(jwt.SigningMethodHS256, atClaims)
  27. td.AccessToken, err = at.SignedString([]byte(global.SystemConfig.Jwt.Signkey))
  28. if err != nil {
  29. return nil, err
  30. }
  31. //Creating Refresh Token
  32. refrushTokenExpire := global.SystemConfig.Redis.Cache.RefrushTokenExpire
  33. td.RtExpires = time.Now().Add(time.Second * time.Duration(refrushTokenExpire)).Unix()
  34. td.RefreshUuid = "uuid_"+td.TokenUuid + "++" + appid
  35. rtClaims := jwt.MapClaims{}
  36. rtClaims["refresh_uuid"] = td.RefreshUuid
  37. rtClaims["appId"] = appid //账号
  38. rtClaims["appSecret"] = appSecret //账号
  39. rtClaims["exp"] = td.RtExpires
  40. rt := jwt.NewWithClaims(jwt.SigningMethodHS256, rtClaims)
  41. td.RefreshToken, err = rt.SignedString([]byte(global.SystemConfig.Jwt.Signkey))
  42. if err != nil {
  43. return nil, err
  44. }
  45. return td, nil
  46. }
  47. func ExtractTokenMetadata(r *http.Request) (*model.AccessDetails, error) {
  48. token, err := VerifyToken(r)
  49. if err != nil {
  50. return nil, err
  51. }
  52. acc, err := Extract(token)
  53. if err != nil {
  54. return nil, err
  55. }
  56. return acc, nil
  57. }
  58. func TokenValid(r *http.Request) error {
  59. token, err := VerifyToken(r)
  60. if err != nil {
  61. return err
  62. }
  63. if _, ok := token.Claims.(jwt.Claims); !ok && !token.Valid {
  64. return err
  65. }
  66. return nil
  67. }
  68. func VerifyToken(r *http.Request) (*jwt.Token, error) {
  69. tokenString := ExtractToken(r)
  70. token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
  71. if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
  72. return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
  73. }
  74. return []byte(global.SystemConfig.Jwt.Signkey), nil
  75. })
  76. if err != nil {
  77. return nil, err
  78. }
  79. return token, nil
  80. }
  81. //get the token from the request header
  82. func ExtractToken(r *http.Request) string {
  83. bearToken := r.Header.Get("token")
  84. if len(bearToken) > 0 {
  85. return bearToken
  86. }
  87. return ""
  88. }
  89. func Extract(token *jwt.Token) (*model.AccessDetails, error) {
  90. claims, ok := token.Claims.(jwt.MapClaims)
  91. if ok && token.Valid {
  92. accessUuid, ok := claims["access_uuid"].(string)
  93. appId,appIdOk := claims["appId"].(string)
  94. appSecret,appSecretOk := claims["appSecret"].(string)
  95. if ok == false || appIdOk==false || appSecretOk==false {
  96. return nil, errors.New("unauthorized")
  97. } else {
  98. return &model.AccessDetails{
  99. TokenUuid: accessUuid,
  100. AppId: appId,
  101. AppSecret: appSecret,
  102. }, nil
  103. }
  104. }
  105. return nil, errors.New("something went wrong")
  106. }