当前位置: 代码网 > it编程>前端脚本>Golang > 在Go中使用jwt的教程详解

在Go中使用jwt的教程详解

2024年07月05日 Golang 我要评论
生成 token 一般用 jwt,常用的两种加密方式是 hs256 和 rs256,借助 "github.com/golang-jwt/jwt/v5" 这个库来实现jwt 由三部分

生成 token 一般用 jwt,常用的两种加密方式是 hs256rs256,借助 "github.com/golang-jwt/jwt/v5" 这个库来实现

jwt 由三部分组成:

  • 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,例如
{
  "alg": "hs256",
  "typ": "jwt"
}

payload 负载

  • 官方规定的字段
    • iss: (issuer) 签发人
    • exp: (expiration time) 过期时间
    • sub: (subject) 主题
    • aud: (audience) 受众
    • nbf: (not before) 生效时间
    • iat: (issued at) 签发时间
    • jti: (jwt id) 编号
  • 自定义字段
    • user: 用户信息
  • 例如
{
  "exp": 1718254332,
  "iat": 1718167932,
  "user": {
    "email": "jack@gmial.com",
    "username": "jack22ssss22"
  }
}
  • signature 签名,这个签名不能泄漏,否则会被篡改

完整的 jwt 就是把这三部分组合起来 hmacsha256(base64urlencode(header).base64urlencode(payload).signature)

hs256 加密

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

生成 token

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

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

apt install openssl

生成 rsa 私钥

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

openssl genrsa -out private.pem 2048

获取到 rsa 秘钥

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

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

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
}

以上就是在go中使用jwt的教程详解的详细内容,更多关于go中使用jwt的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com