首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Go 语言生成和解析 JWT的简单示例

Go 语言生成和解析 JWT的简单示例

作者头像
杜金房
发布2025-09-02 12:05:37
发布2025-09-02 12:05:37
3100
举报

JWT(JSON Web Token) 是一种无状态的身份验证机制,因其轻量、安全、跨域友好等特性,广泛应用于现代 Web 应用中。

什么是 JWT?

JWT(JSON Web Token)是一种开放标准,用于在网络应用环境安全地传递声明。它将用户信息(如用户ID、角色、权限等)编码为一个 JSON 对象,并使用数字签名确保其完整性和真实性。

JWT 的最大特点是:

  • 无状态:服务器不需要保存会话信息。
  • 可跨域使用:适合前后端分离架构。
  • 自包含:所有必要的信息都包含在 Token 中。

JWT 的结构

JWT 由三部分组成:

  • Header(头部)
  • Payload(负载)
  • Signature(签名)

这三部分通过点号(`.`)连接,最终形成一个字符串,例如:

代码语言:javascript
复制
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh93h9FqA

Header(头部)

Header 通常包含令牌的类型和所使用的签名算法。

代码语言:javascript
复制
json
{
  "alg": "HS256",
  "typ": "JWT"
}

Payload(负载)

Payload 是 JWT 的有效负载,包含声明(claims)。声明分为三类:

  • 注册声明(Registered claims):预定义的声明,如 `iss`(签发者)、`exp`(过期时间)、`sub`(主题)等。
  • 公共声明(Public claims):自定义的声明,但需避免冲突。
  • 私有声明(Private claims):自定义的数据,用于特定场景。

示例:

代码语言:javascript
复制
json
{
  "sub": "1234567890",
  "name": "xxx",
  "admin": true,
  "iat": 1516239022,
  "exp": 1516242622
}

Signature(签名)

签名部分是对头部和负载的签名,使用头部中声明的算法和密钥生成。其目的是确保数据未被篡改。

公式如下:

代码语言:javascript
复制
HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret_key
)

JWT 的工作流程

  • 用户登录:客户端将用户名和密码发送到认证服务器。
  • 签发 Token:服务器验证成功后,生成一个 JWT 返回给客户端。
  • 携带 Token:客户端在后续请求中将 JWT 放在 HTTP 请求头中(通常为 `Authorization: Bearer <token>`)。
  • 验证 Token:服务器收到请求后,解析并验证 JWT 的签名和有效期,确认用户身份。
  • 返回响应:服务器根据用户权限返回相应的数据。

Go 语言中使用 JWT 的实战示例

下面以 Go 语言为例,展示如何生成和解析 JWT。

  • 安装依赖
代码语言:javascript
复制
go get -u github.com/golang-jwt/jwt/v5
  • 生成 Token
代码语言:javascript
复制
package main
import (
    "fmt"
    "time"
    "github.com/golang-jwt/jwt/v5"
)
// jwtKey 是用于签名和验证JWT令牌的秘密密钥
var jwtKey = []byte("your-secret-key")
// Claims 定义了自定义声明,包括用户名和标准JWT声明
type Claims struct {
    Username string `json:"username"`
    jwt.RegisteredClaims
}
// generateToken 函数生成一个新的JWT令牌
func generateToken(username string) (string, error) {
    // 设置令牌过期时间为当前时间加上5分钟
    expirationTime := time.Now().Add(5 * time.Minute)
    // 创建包含用户名和标准JWT声明的声明对象
    claims := &Claims{
        Username: username,
        RegisteredClaims: jwt.RegisteredClaims{
            ExpiresAt: jwt.NewNumericDate(expirationTime), // 过期时间
            IssuedAt:  jwt.NewNumericDate(time.Now()),      // 签发时间
            Issuer:    "test",                            // 签发者
        },
    }
    // 使用HS256算法创建新的JWT令牌,并返回签名后的字符串形式
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    return token.SignedString(jwtKey)
}
  • 解析 Token
代码语言:javascript
复制
// parseToken 函数解析JWT令牌并返回其中的声明
func parseToken(tokenStr string) (*Claims, error) {
    claims := &Claims{}
    // 解析JWT令牌,使用提供的claims对象存储声明,并使用jwtKey进行验证
    token, err := jwt.ParseWithClaims(tokenStr, claims, func(token *jwt.Token) (interface{}, error) {
        return jwtKey, nil
    })
    if err != nil {
        return nil, err // 返回解析过程中发生的错误
    }
    if !token.Valid {
        return nil, fmt.Errorf("invalid token") // 如果令牌无效,返回错误
    }
    return claims, nil // 返回有效的声明
}

以上就是本文全部内容,感谢观看。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeSWITCH中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档