前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >怎么在在 go 中使用 jwt

怎么在在 go 中使用 jwt

作者头像
科技新语
发布2024-06-21 17:59:34
810
发布2024-06-21 17:59:34

jwt 由三部分组成:

  1. header 头部
    • 官方规定的字段:
      • alg: (algorithm) 算法
      • typ: (type) 类型
      • cty: (content type) 内容类型
      • kid: (key ID) 密钥 ID
      • x5u: (X.509 URL) X.509 地址
      • x5c: (X.509 certificate chain) X.509 证书链
      • crit: (critical) 关键
    • 一般使用 algtype,例如 json复制代码{ "alg": "HS256", "typ": "JWT" }
  2. payload 负载
    • 官方规定的字段
      • iss: (issuer) 签发人
      • exp: (expiration time) 过期时间
      • sub: (subject) 主题
      • aud: (audience) 受众
      • nbf: (Not Before) 生效时间
      • iat: (Issued At) 签发时间
      • jti: (JWT ID) 编号
    • 自定义字段
      • user: 用户信息
    • 例如 go复制代码{ "exp": 1718254332, "iat": 1718167932, "user": { "email": "jack@gmial.com", "username": "jack22ssss22" } }
  3. signature 签名,这个签名不能泄漏,否则会被篡改

完整的 jwt 就是把这三部分组合起来 HMACSHA256(base64UrlEncode(Header).base64UrlEncode(Payload).Signature)

HS256 加密

HS256 是一种对称加密算法,使用秘密密钥对每条消息进行签名和验证

生成 token

代码语言:javascript
复制
go复制代码func GenerateJWTHS256(username, email string) (string, error) {
  key := []byte("secret")
  tokenDuration := 24 * time.Hour
  now := time.Now()
  t := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
    "user": map[string]string{
      "username": username,
      "email":    email,
    },
    "iat": now.Unix(),
    "exp": now.Add(tokenDuration).Unix(),
  })
  return t.SignedString(key)
}

验证 token

代码语言:javascript
复制
go复制代码func VerifyJWTHS256(token string) (*jwt.MapClaims, bool, error) {
  var claim jwt.MapClaims
  claims, err := jwt.ParseWithClaims(token, &claim, func(t *jwt.Token) (interface{}, error) {
    return []byte("secret"), nil
  })
  if err != nil {
    return nil, false, err
  }
  if claims.Valid {
    return &claim, true, nil
  }
  return nil, false, nil
}

RS256 加密

RS256 是一种非对称加密算法,使用私钥加密明文,公钥解密密文

安装 openssl

代码语言:javascript
复制
bash复制代码apt install openssl

生成 rsa 私钥

在当前目录下生成一个 2048 位的私钥文件 private.pem

代码语言:javascript
复制
bash复制代码openssl genrsa -out private.pem 2048

生成 rsa 公钥

代码语言:javascript
复制
bash复制代码openssl rsa -in private.pem -outform PEM -pubout -out public.pem

获取到 rsa 秘钥

代码语言:javascript
复制
go复制代码var privateKey *rsa.PrivateKey
var publicKey *rsa.PublicKey

func init() {
  var err error
  var bytes []byte
  bytes, err = os.ReadFile("/root/uccs/realworld/private.pem")
  if err != nil {
    panic(err)
  }
  privateKey, err = jwt.ParseRSAPrivateKeyFromPEM(bytes)
  if err != nil {
    panic(err)
  }

  bytes, err = os.ReadFile("/root/uccs/realworld/public.pem")
  if err != nil {
    panic(err)
  }
  publicKey, err = jwt.ParseRSAPublicKeyFromPEM(bytes)
  if err != nil {
    panic(err)
  }
}

生成 token

代码语言:javascript
复制
go复制代码func GenerateJWTRS256(username, email string) (string, error) {
  tokenDuration := 24 * time.Hour
  now := time.Now()
  t := jwt.NewWithClaims(jwt.SigningMethodRS256, jwt.MapClaims{
    "user": map[string]string{
      "username": username,
      "email":    email,
    },
    "iat": now.Unix(),
    "exp": now.Add(tokenDuration).Unix(),
  })
  return t.SignedString(privateKey)
}

验证 token

代码语言:javascript
复制
go复制代码func VerifyJWTRS256(token string) (*jwt.MapClaims, bool, error) {
  var claim jwt.MapClaims
  claims, err := jwt.ParseWithClaims(token, &claim, func(t *jwt.Token) (interface{}, error) {
    return publicKey, nil
  })
  if err != nil {
    return nil, false, err
  }
  if claims.Valid {
    return &claim, true, nil
  }
  return nil, false, nil
}

本文系转载,前往查看

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

本文系转载前往查看

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • HS256 加密
    • 生成 token
      • 验证 token
      • RS256 加密
        • 安装 openssl
          • 生成 rsa 私钥
            • 生成 rsa 公钥
              • 获取到 rsa 秘钥
                • 生成 token
                  • 验证 token
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档