JWT 认证

概述

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用间传递声明式信息。它是一种基于JSON的轻量级的身份验证和授权机制,用于在客户端和服务器之间安全地传输信息。

JWT由三部分组成:头部(header)、载荷(payload)和签名(signature)。

头部通常由两部分组成:令牌类型和所使用的加密算法。载荷是包含令牌中存储的信息的主要部分。它包括一些声明(claim),例如用户ID、用户名、过期时间等等。签名是将头部和载荷组合后使用密钥生成的哈希值,用于验证令牌的真实性。

go-zero 中内置了 JWT 的解密和验证功能,你可以通过可选参数来控制是否启用 JWT。

使用示例

  1. func main() {
  2. srv := rest.MustNewServer(rest.RestConf{
  3. Port: 8080,
  4. })
  5. srv.AddRoute(rest.Route{
  6. Method: http.MethodGet,
  7. Path: "/hello",
  8. Handler: handle,
  9. }, rest.WithJwt("abc123")/*开启 JWT 功能,并设置 secret 为 abc123 */)
  10. defer srv.Stop()
  11. srv.Start()
  12. }
  13. func handle(w http.ResponseWriter, r *http.Request) {
  14. httpx.OkJson(w, "hello world")
  15. }

JWT Token 生成示例

  1. // @secretKey: JWT 加解密密钥
  2. // @iat: 时间戳
  3. // @seconds: 过期时间,单位秒
  4. // @payload: 数据载体
  5. func getJwtToken(secretKey string, iat, seconds int64,payload string) (string, error) {
  6. claims := make(jwt.MapClaims)
  7. claims["exp"] = iat + seconds
  8. claims["iat"] = iat
  9. claims["payload"] = payload
  10. token := jwt.New(jwt.SigningMethodHS256)
  11. token.Claims = claims
  12. return token.SignedString([]byte(secretKey))
  13. }

JWT 认证失败自定义处理返回

在main.go中定义一个callback即可

  1. func main() {
  2. ........
  3. server := rest.MustNewServer(c.RestConf, rest.WithUnauthorizedCallback(func(w http.ResponseWriter, r *http.Request, err error) {
  4. // 自定义处理返回
  5. }))
  6. .......
  7. }
JWT 认证 - 图1tip

如果 JWT 鉴权失败会出现如下类似错误:

  1. HTTP/1.1 401 Unauthorized
  2. Date: Mon, 08 Feb 2023 23:41:57 GMT
  3. Content-Length: 0

JWT 过期管理

jwt token 过期管理可以自己使用 redis 实现。

参考文献