使用JWT作为中间件鉴权|青训营笔记

107 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第6天

什么是JWT

JSON Web Token是目前最流行的跨域认证解决方案

  1. 三部分组成:

Header(头部)

Payload(负载)

Signature(签名)

形式:Header.Payload.Signature

  1. 如何生成

Token鉴权

作为中间件

  1. 直接在每个接口做token校验
token := c.Query("token")
res, _ := util.ParseToken(token)
if res == nil {
        c.JSON(http.StatusOK, UserResponse{
            Response: Response{StatusCode: 1, StatusMsg: "Token鉴权失败"},
        })
    } else {
        usi := service.UserServiceImpl{}

        id, _ := strconv.ParseInt(userId, 10, 64)
        if user, err := usi.GetUserLoginInfoById(id); err != nil {
            c.JSON(http.StatusOK, UserResponse{
                Response: Response{StatusCode: 1, StatusMsg: "User doesn't exist"},
            })
        } else {
            c.JSON(http.StatusOK, UserResponse{
                Response: Response{StatusCode: 0, StatusMsg: "Query Success"},
                User:     User(user),
            })
        }
    }
  1. 使用中间件在在访问接口时做token校验

上面一部分代码可以删了

步骤:

  1. 在middleware目录下新建jwt目录,在其新建jwt.go文件
package jwt

import (
	"github.com/gin-gonic/gin"
	"log"
	"net/http"
	"x-tiktok/util"
)

type Response struct {
	StatusCode int32  `json:"status_code"`
	StatusMsg  string `json:"status_msg,omitempty"`
}

// Auth 鉴权中间件
func Auth() gin.HandlerFunc {
	return func(c *gin.Context) {
		token := c.Query("token")
		if len(token) == 0 {
			// 没有token, 阻止后面函数执行
			c.Abort()
			c.JSON(http.StatusUnauthorized, Response{
				StatusCode: -1,
				StatusMsg:  "Unauthorized",
			})
		} else {
			claims, err := util.ParseToken(token)
			if err != nil {
				// token有误,阻止后面函数执行
				c.Abort()
				c.JSON(http.StatusUnauthorized, Response{
					StatusCode: -1,
					StatusMsg:  "Token Error",
				})
			} else {
				log.Println("token correct")
			}
			c.Set("userId", claims.Id)
			c.Next()
		}
	}
}
  1. 修改router.go

在需要鉴权的接口前面添加我们上一步定义的中间件

apiRouter.GET("/user/", jwt.Auth(), controller.UserInfo)

大家负责的接口,如果需要校验token,在api加上中间件函数即可。

  1. 根据token获取用户ID

可以通过token获取用户信息。如果还有需要其他信息可以说一下

userId, _ := c.Get("userId")

reference