jwt.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package helper
  2. import (
  3. "errors"
  4. "fmt"
  5. "kng_feed_api/model"
  6. "os"
  7. "strconv"
  8. "strings"
  9. "time"
  10. "github.com/gin-gonic/gin"
  11. "github.com/golang-jwt/jwt/v4"
  12. )
  13. var privateKey = []byte(os.Getenv("JWT_PRIVATE_KEY"))
  14. func GenerateJWT(user model.User) (string, error) {
  15. tokenTTL, _ := strconv.Atoi(os.Getenv("TOKEN_TTL"))
  16. token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
  17. "id": user.ID,
  18. "iat": time.Now().Unix(),
  19. "eat": time.Now().Add(time.Second * time.Duration(tokenTTL)).Unix(),
  20. })
  21. return token.SignedString(privateKey)
  22. }
  23. func ValidateJWT(context *gin.Context) error {
  24. token, err := getToken(context)
  25. if err != nil {
  26. return err
  27. }
  28. _, ok := token.Claims.(jwt.MapClaims)
  29. if ok && token.Valid {
  30. return nil
  31. }
  32. return errors.New("invalid token provided")
  33. }
  34. func CurentUser(context *gin.Context) (model.User, error) {
  35. err := ValidateJWT(context)
  36. if err != nil {
  37. return model.User{}, err
  38. }
  39. token, _ := getToken(context)
  40. claims, _ := token.Claims.(jwt.MapClaims)
  41. userId := uint(claims["id"].(float64))
  42. user, err := model.FindUserById(userId)
  43. if err != nil {
  44. return model.User{}, err
  45. }
  46. return user, nil
  47. }
  48. func getToken(context *gin.Context) (*jwt.Token, error) {
  49. tokenString := getTokenFromRequest(context)
  50. token, err := jwt.Parse(tokenString, func(t *jwt.Token) (interface{}, error) {
  51. if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok {
  52. return nil, fmt.Errorf("unexpected signing method: %v", t.Header["alg"])
  53. }
  54. return privateKey, nil
  55. })
  56. return token, err
  57. }
  58. func getTokenFromRequest(context *gin.Context) string {
  59. bearerToken := context.Request.Header.Get("Autorization")
  60. splitToken := strings.Split(bearerToken, " ")
  61. if len(splitToken) == 2 {
  62. return splitToken[1]
  63. }
  64. return ""
  65. }