kitex-jwt
在 Kitex 框架下,在 Hertz 服务器上添加 HertzJWTMiddleware
中间件对用户进行身份验证
什么是 HertzJWTMiddleware
HertzJWTMiddleware 是一个用于处理 JWT(JSON Web Token)认证的中间件,主要用于保护 API 端点,确保只有经过身份验证的用户才能访问受保护的资源。以下是 HertzJWTMiddleware 中间件的详细介绍,包括其主要方法和功能:
主要方法和功能 (不完整)
LoginHandler:
- 处理用户登录请求。验证用户的登录信息(如用户名和密码),如果验证成功,则生成并返回一个 JWT token
1
LoginHandler: func(ctx context.Context, c *app.RequestContext) {}
MiddlewareFunc:
- 这是中间件的核心方法,用于在每个请求到达时执行 JWT 验证逻辑。它会从请求中提取 JWT token,并验证其有效性
- 确保只有持有有效 JWT Token 的请求才能够访问到受保护的资源
1
MiddlewareFunc: func(ctx context.Context, c *app.RequestContext) {}
ParseToken:
- 从请求中提取并解析 JWT token。验证 token 的签名和有效期,并提取其中的用户信息
1
ParseToken: func(ctx context.Context, c *app.RequestContext) (*jwt.Token, error) {}
Unauthorized:
- 定义未授权请求的处理逻辑。当请求未通过 JWT 验证时,会调用此方法返回未授权的响应
1
Unauthorized: func(ctx context.Context, c *app.RequestContext, code int, message string) {}
PayloadFunc:
- 定义生成 JWT token 时的负载数据。通常用于在 token 中包含用户的身份信息(如用户 ID)
1
PayloadFunc: func(data interface{}) jwt.MapClaims {}
TokenLookup:
- 配置 token 的查找位置。可以指定从请求头、查询参数或 cookie 中提取 token
1
TokenLookup: "header: Authorization, query: token, cookie: jwt",
TimeFunc:
- 定义时间函数,用于计算 token 的过期时间
1
TimeFunc: time.Now
Authenticator:
- 定义用户认证的具体逻辑。通常在用户登录时调用,验证用户的登录信息(如用户名和密码)
1
Authenticator: func(ctx context.Context, c *app.RequestContext) (interface{}, error) {}
如何去自定义这些方法
在初始化的时候将自定义的方法传递给对应的方法,或者直接在后面进行定义
1 |
|
身份验证流程
Login
- 在 Hertz 服务器初始化的时候就会同步去初始化所有的用于用户身份验证的 JWT 中间件
- 用户在登录的时候会触发 JWT 中间件,去调用中间件的
LoginHandler
方法,这个方法最后的返回值就是一个 JWT Token LoginHandler
在执行的过程中会去调用中间件的Authenticator
方法,在这个方法中对用户的登录账号密码进行验证(自定义)Authenticator
方法会调用远端的 User 服务进行身份验证(rpc)- 会先去调用 User 远端服务的客户端,客户端再向远端服务端发送请求并且获得具体的响应
Authenticator
的返回值(interface{}
类型)会传递给PayloadFunc
定义生成 JWT Token 时的负载数据- 然后中间件根据初始化时设定的一系列配置和负载数据创建一个 Token 并返回
验证 Token
- 在指定的路径 Group 下直接使用上面定义并且初始化好的
HertzJWTMiddleware
中间件 - 当该路径 Group 下一个请求到达的时候,Hertz 服务器会先调用
MiddlewareFunc
对请求头中的 Token 进行验证 - Token 在请求中具体的位置以及格式都需要在上面初始化的时候进行定义
- 验证通过继续向下传递给对应的 Handler ,验证失败则直接返回
用户 Login 过程
初始化中间件
1 | func Init() { |
登陆逻辑
1 |
|
client 客户端
1 | func CheckUser(ctx context.Context, req *user.CheckUserReq) (int32, error) { |
user 服务端
1 | // rpc/user/handler.go |
其他用户请求处理
1 | // manager service |