这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
JWT 认证
JSON Web Token(JWT)是一个轻量级的认证规范,这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息。其本质是一个 token ,是一种紧凑的 URL 安全方法,用于在网络通信的双方之间传递。
我们可以手动生成一个 JWT 认证,并在获取到 token 时再手动解析,这样的代码网上已经有很多,这里就不赘述了。本文章主要讲解在 Hertz 框架下,使用 Hertz 提供的 JWT 中间件来实现 JWT 认证
安装
首先我们进行安装,使用以下命令即可
go get github.com/hertz-contrib/jwt
使用
在我的项目中,我遵循以下项目结构: Go工程化(二) 项目目录结构 - Mohuishou
在这个项目结构中我在 biz 目录下新建了一个 mw 目录,用于存放所有与中间件相关的代码。在 mw 目录中创建文件 jwt. go 在其中写关于 JWT 认证相关代码。
authMiddleware, err := jwt.New(&jwt.HertzJWTMiddleware{
Realm: "test zone",
Key: []byte("secret key"),
Timeout: time.Hour,
MaxRefresh: time.Hour,
IdentityKey: identityKey,
PayloadFunc: func(data interface{}) jwt.MapClaims {
//...
},
IdentityHandler: func(ctx context.Context, c *app.RequestContext) interface{} {
//...
},
Authenticator: func(ctx context.Context, c *app.RequestContext) (interface{}, error) {
//...
},
Authorizator: func(data interface{}, ctx context.Context, c *app.RequestContext) bool {
//...
},
Unauthorized: func(ctx context.Context, c *app.RequestContext, code int, message string) {
//...
},
})
if err != nil {
log.Fatal("JWT Error:" + err.Error())
}
向其中创建一个方法用于获取 JWT 中间件,并在这个方法中加入以上代码。
提示
因为 JWT 的核心是认证与授权,所以在使用 Hertz 的 jwt 扩展时,不仅需要为 /login 接口绑定认证逻辑 authMiddleware.LoginHandler。
还要以中间件的方式,为需要授权访问的路由组注入授权逻辑 authMiddleware.MiddlewareFunc()。
例如我在项目的路由中加入了以下代码
// the service that does not need authentication
noAuth := h.Group("/douyin")
{
login := noAuth.Group("/user")
{
login.POST("/register/", func(c context.Context, ctx *app.RequestContext) {
// if register success then auto login
if err := service.Register(c, ctx); err != nil {
ctx.JSON(http.StatusOK, mw.UserLoginResponse{
Response: utils.Response{StatusCode: 400, StatusMsg: err.Error()},
})
return
}
mw.JwtMiddleware.LoginHandler(c, ctx)
})
login.POST("/login/", mw.JwtMiddleware.LoginHandler)
}
}
// the service that need authentication
withAuth := h.Group("/douyin", mw.JwtMiddleware.MiddlewareFunc())
{
user := withAuth.Group("/user")
{
user.GET("/", service.GetUserInfo)
}
}
配置
Hertz 通过使用中间件,为路由请求提供了 jwt 的校验功能。其中 HertzJWTMiddleware 结构定义了 jwt 配置信息,并提供了默认配置,用户也可以依据业务场景进行定制。具体配置可以参考官网 JWT认证 | CloudWeGo