jwt_auth.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package middleware
  2. import (
  3. "app/commons/core"
  4. "github.com/gin-gonic/gin"
  5. "net/http"
  6. "time"
  7. )
  8. const AuthorizationHeader = "Authorization"
  9. // JwtMiddleware JWT中间件, 强制要求用户登录
  10. func JwtMiddleware() gin.HandlerFunc {
  11. return func(c *gin.Context) {
  12. tokenString := c.GetHeader(AuthorizationHeader)
  13. if tokenString == "" {
  14. core.Log.Info("未携带token")
  15. c.AbortWithStatusJSON(http.StatusUnauthorized, core.ResponseMissAuthToken)
  16. return
  17. }
  18. // 解析JWT
  19. member, err := ParseJWT(tokenString)
  20. //core.Log.Infof("member:%+v", member)
  21. if err != nil || member == nil || member.ExpiresAt.Time.Before(time.Now()) {
  22. c.AbortWithStatusJSON(http.StatusUnauthorized, core.ResponseTokenInvalid)
  23. return
  24. }
  25. // token有效,设置用户信息到上下文
  26. setClaimsToContext(c, member)
  27. // 继续执行
  28. c.Next()
  29. }
  30. }
  31. // setClaimsToContext 设置用户信息到上下文
  32. func setClaimsToContext(c *gin.Context, member *MyClaims) {
  33. c.Set("userId", member.UserID)
  34. c.Set("uid", member.Uid)
  35. c.Set("openId", member.OpenId)
  36. c.Set("exp", member.ExpiresAt)
  37. c.Set("issuer", member.Issuer)
  38. }
  39. // OptionalJwtMiddleware 允许用户携带 JWT,但不强制要求登录
  40. func OptionalJwtMiddleware() gin.HandlerFunc {
  41. return func(c *gin.Context) {
  42. tokenString := c.GetHeader(AuthorizationHeader)
  43. if tokenString != "" {
  44. // 解析JWT
  45. member, err := ParseJWT(tokenString)
  46. if err == nil {
  47. if member != nil {
  48. setClaimsToContext(c, member)
  49. }
  50. }
  51. //else {
  52. // core.Log.Infof("OptionalJwtMiddleware:%s", err.Error())
  53. //}
  54. }
  55. c.Next()
  56. }
  57. }