这是我参与「第五届青训营 」伴学笔记创作活动的第6天
什么是JWT
JSON Web Token是目前最流行的跨域认证解决方案
- 三部分组成:
Header(头部)
Payload(负载)
Signature(签名)
形式:Header.Payload.Signature
- 如何生成
Token鉴权
作为中间件
- 直接在每个接口做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),
})
}
}
- 使用中间件在在访问接口时做token校验
上面一部分代码可以删了
步骤:
- 在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()
}
}
}
- 修改router.go
在需要鉴权的接口前面添加我们上一步定义的中间件
apiRouter.GET("/user/", jwt.Auth(), controller.UserInfo)
大家负责的接口,如果需要校验token,在api加上中间件函数即可。
- 根据token获取用户ID
可以通过token获取用户信息。如果还有需要其他信息可以说一下
userId, _ := c.Get("userId")