Go 语言 JWT 认证 | 青训营笔记

564 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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