怎么在在 go 中使用 jwt

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

 

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

 

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

 

bash

复制代码

apt install openssl

生成 rsa 私钥

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

 

bash

复制代码

openssl genrsa -out private.pem 2048

生成 rsa 公钥

 

bash

复制代码

openssl rsa -in private.pem -outform PEM -pubout -out public.pem

获取到 rsa 秘钥

 

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

 

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

 

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 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值