这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天
本文将简单介绍Herze框架以及在青训营项目中用到的JWT认证中间件。
简介
Hertz是一个 Golang 微服务 HTTP 框架,在设计之初参考了其他开源框架 fasthttp、gin、echo 的优势, 并结合字节跳动内部的需求,使其具有高易用性、高性能、高扩展性等特点,目前在字节跳动内部已广泛使用。 如今越来越多的微服务选择使用 Golang,如果对微服务性能有要求,又希望框架能够充分满足内部的可定制化需求,Hertz 会是一个不错的选择。
中间件概览
中间件可以在请求更深入地传递到业务逻辑之前或之后执行:
- 中间件可以在请求到达业务逻辑之前执行,比如执行身份认证和权限认证,当中间件只有初始化(pre-handle)相关逻辑,且没有和 real handler 在一个函数调用栈中的需求时,中间件中可以省略掉最后的
.Next,如图1的中间件 B。 - 中间件也可以在执行过业务逻辑之后执行,比如记录响应时间和从异常中恢复。如果在业务 handler 处理之后有其它处理逻辑( post-handle ),或对函数调用链(栈)有强需求,则必须显式调用
.Next,如图1的中间件 C。
JWT认证中间件
因为 JWT 的核心是认证与授权,所以在使用 Hertz 的 jwt 扩展时,不仅需要为 /login 接口绑定认证逻辑 authMiddleware.LoginHandler。
还要以中间件的方式,为需要授权访问的路由组注入授权逻辑 authMiddleware.MiddlewareFunc()。
配置
Hertz 通过使用中间件,为路由请求提供了 jwt 的校验功能。其中 HertzJWTMiddleware 结构定义了 jwt 配置信息,并提供了默认配置,用户也可以依据业务场景进行定制。
有两项必需的配置为Key和Authenticator。
Key
用于设置 token 的签名密钥。
示例代码:
authMiddleware, err := jwt.New(&jwt.HertzJWTMiddleware{
Key: []byte("secret key"),
})
Authenticator
配合 HertzJWTMiddleware.LoginHandler 使用,登录时触发,用于认证用户的登录信息。
函数签名:
func(ctx context.Context, c *app.RequestContext) (interface{}, error)