这是我参与「第五届青训营 」伴学笔记创作活动的第 5天
middleware
Hertz-JWT
PayloadFunc
用于设置登录时为 token 添加自定义负载信息的函数,如果不传入这个参数,则 token 的 payload 部分默认存储 token 的过期时间和创建时间,如下则额外存储了用户名信息。
// 函数签名
func(data interface{}) jwt.MapClaims
// MapClaims type that uses the map[string]interface{} for JSON decoding
// This is the default claims type if you don't supply one
type MapClaims map[string]interface{}
// 向token中添加用户名信息!
authMiddleware, err := jwt.New(&{
PayloadFunc: func(data interface{}) jwt.MapClaims {
if v, ok := data.(*User); ok {
return jwt.MapClaims{
identityKey: v.UserName,
}
}
return jwt.MapClaims{}
},
})
LoginResponse
用于设置登录的响应函数,作为 LoginHandler 的响应结果。
函数签名:
func(ctx context.Context, c *app.RequestContext, code int, token string, expire time.Time)
可以通过c来 控制回应,同时附加token
Authenticator
因为 JWT 的核心是认证与授权,
所以不仅需要为 /login 接口绑定认证逻辑 authMiddleware.LoginHandler。
// Authentification
user1.POST("/login", authMiddleware.LoginHandler)
函数签名为
func(ctx context.Context, c *app.RequestContext, code int, message string)
可以从 c 中拿到用户的登录信息,判断无误后,调用rpc中验证用户签名的逻辑
这里要读出数据库里的加密密码,通过把用户密码加密,进行比较
下面是md5加密
h := md5.New()
if _, err := io.WriteString(h, req.Password); err != nil {
return 0, err
}
passWord := fmt.Sprintf("%x", h.Sum(nil))
Authorize
还要以中间件的方式,为 需要授权访问的路由组 注入授权逻辑 authMiddleware.MiddlewareFunc()
给 note1 这个路由组施加授权
// Authorize
note1 := v1.Group("/note")
note1.Use(authMiddleware.MiddlewareFunc())
Unauthorized
jwt 授权失败后的响应函数,如下函数将参数列表中的错误码和错误信息封装成 json 响应返回
对应着 Authorize 的路由,在配置中间件处设着
Key
用于设置 token 的签名密钥,只有后端知道,进行加密
Key: []byte(your_private key)