jwtcontext.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package middleware
  2. import (
  3. "fmt"
  4. "github.com/gin-gonic/gin"
  5. "icloudapp.cn/tools/entity"
  6. "icloudapp.cn/tools/service"
  7. "net/http"
  8. "strings"
  9. )
  10. // 基于JWT认证的中间件 验证token的中间件
  11. func JWTAuthMiddleware() func(c *gin.Context) {
  12. return func(ctx *gin.Context) {
  13. //携带Token有三种方式
  14. //1.放在请求头
  15. //2.放在请求体
  16. //3.放在URI
  17. //这里实现的方法是Token放在header的Authorization,并使用Bearer开头
  18. authHeader := ctx.Request.Header.Get("Authorization") //获取请求中头部的token
  19. cookie, _ := ctx.Cookie("poster_sid")
  20. if authHeader == "" && cookie != "" {
  21. authHeader = "Bearer " + cookie
  22. }
  23. if authHeader == "" {
  24. ctx.JSON(http.StatusOK, gin.H{
  25. "code": entity.CodeAuthIsNull,
  26. "msg": entity.CodeAuthIsNull.Msg(),
  27. })
  28. ctx.Abort() //授权失败,调用Abort以确保没有调用此请求的其余处理程序
  29. return
  30. }
  31. parts := strings.SplitN(authHeader, " ", 2)
  32. if !(len(parts) == 2 && parts[0] == "Bearer") {
  33. ctx.JSON(http.StatusOK, gin.H{
  34. "code": entity.CodeInvalidToken,
  35. "msg": entity.CodeInvalidToken.Msg(),
  36. })
  37. ctx.Abort()
  38. return
  39. }
  40. posterClaim, err := service.ParseJWTToken(parts[1])
  41. if err != nil {
  42. ctx.JSON(http.StatusOK, gin.H{
  43. "code": entity.CodeTokenExpired,
  44. "msg": entity.CodeTokenExpired.Msg(),
  45. })
  46. ctx.Abort()
  47. return
  48. }
  49. //token 和 redis 中保存的不匹配,也验证失败
  50. token := service.GetJWTTokenFromRedis(posterClaim.Uid)
  51. if token == "" || token != parts[1] {
  52. ctx.JSON(http.StatusOK, gin.H{
  53. "code": entity.CodeAuthFail,
  54. "msg": entity.CodeAuthFail.Msg(),
  55. })
  56. ctx.Abort()
  57. return
  58. }
  59. //将当前请求的username信息保存到请求的上下文c
  60. ctx.Set("jwt_uid", posterClaim.Uid)
  61. ctx.Set("jwt_username", posterClaim.Username)
  62. //设置Request参数
  63. ctx.AddParam("jwt_uid", fmt.Sprint(posterClaim.Uid))
  64. ctx.AddParam("jwt_username", posterClaim.Username)
  65. ctx.Next()
  66. }
  67. }