jwt.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package middleware
  2. import (
  3. "errors"
  4. "fmt"
  5. "speechAnalysis/conf"
  6. "strings"
  7. "time"
  8. jwt "github.com/dgrijalva/jwt-go"
  9. "github.com/gin-gonic/gin"
  10. "speechAnalysis/extend/util"
  11. )
  12. func validateToken(tokenString string) (util.JSON, error) {
  13. secretKey := []byte(conf.WebConf.JWTSecret)
  14. token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
  15. // Don't forget to validate the alg is what you expect:
  16. if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
  17. return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"])
  18. }
  19. return secretKey, nil
  20. })
  21. if err != nil {
  22. return util.JSON{}, err
  23. }
  24. if !token.Valid {
  25. return util.JSON{}, errors.New("invalid token")
  26. }
  27. return token.Claims.(jwt.MapClaims), nil
  28. }
  29. // JWTMiddleware parses JWT token from cookie and stores data and expires date to the context
  30. // JWT Token can be passed as cookie, or Authorization header
  31. func JWTMiddleware() gin.HandlerFunc {
  32. return func(c *gin.Context) {
  33. tokenString, err := c.Cookie("token")
  34. // failed to read cookie
  35. if err != nil {
  36. // try reading HTTP Header
  37. authorization := c.Request.Header.Get("Authorization")
  38. if authorization == "" {
  39. c.Next()
  40. return
  41. }
  42. sp := strings.Split(authorization, "Bearer ")
  43. // invalid token
  44. if len(sp) < 1 {
  45. c.Next()
  46. return
  47. }
  48. tokenString = sp[1]
  49. }
  50. tokenData, err := validateToken(tokenString)
  51. if err != nil {
  52. fmt.Println(err.Error())
  53. c.Next()
  54. return
  55. }
  56. userParentId := tokenData["parentId"].(string)
  57. if userParentId == conf.WebConf.NodeId {
  58. c.Set("parentId", userParentId)
  59. } else {
  60. c.Next()
  61. return
  62. }
  63. c.Set("token_expire", tokenData["exp"])
  64. c.Next()
  65. }
  66. }
  67. func GenerateToken(data interface{}) (string, error) {
  68. // token is valid for 1 hour
  69. date := time.Now().Add(time.Hour * 12)
  70. token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
  71. "user": data,
  72. "exp": date.Unix(),
  73. })
  74. secretKey := []byte(conf.WebConf.JWTSecret)
  75. tokenString, err := token.SignedString(secretKey)
  76. return tokenString, err
  77. }