Hertz-JWT | 青训营笔记

180 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5天

middleware

Hertz-JWT

PayloadFunc

用于设置登录时为 token 添加自定义负载信息的函数,如果不传入这个参数,则 tokenpayload 部分默认存储 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)