在Go中使用jwt的教程详解

 更新时间:2024年06月13日 08:55:14   作者:uccs  
JWT (JSON Web Tokens) 是一种基于 JSON 格式的轻量级身份验证和授权方案,用于在各方之间以JSON方式安全地传输信息,本文给大家详细介绍了在Go中使用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的资料请关注脚本之家其它相关文章!

相关文章

  • Go gRPC超时控制Deadlines用法详解

    Go gRPC超时控制Deadlines用法详解

    这篇文章主要为大家介绍了Go gRPC超时控制Deadlines用法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go 代码规范错误处理示例经验总结

    Go 代码规范错误处理示例经验总结

    这篇文章主要为大家介绍了Go 代码规范错误处理示例实战经验总结,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Go语言并发编程 互斥锁详情

    Go语言并发编程 互斥锁详情

    在并发编程中,多个Goroutine访问同一块内存资源时可能会出现竞态条件,我们需要在临界区中使用适当的同步操作来以避免竞态条件。Go 语言中提供了很多同步工具,本文将介绍互斥锁Mutex和读写锁RWMutex的使用方法。
    2021-10-10
  • 聊聊Go语言编译github上的项目遇到的坑

    聊聊Go语言编译github上的项目遇到的坑

    这篇文章主要介绍了解决Go语言编译github上的项目遇到的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Go Interface接口初学者手册

    Go Interface接口初学者手册

    这篇文章主要为大家介绍了Go Interface接口的基础用法实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 深入了解Golang网络编程Net包的使用

    深入了解Golang网络编程Net包的使用

    net包主要是增加 context 控制,封装了一些不同的连接类型以及DNS 查找等等,同时在有需要的地方引入 goroutine 提高处理效率。本文主要和大家分享下在Go中网络编程的实现,需要的可以参考一下
    2022-07-07
  • Golang信号处理及如何实现进程的优雅退出详解

    Golang信号处理及如何实现进程的优雅退出详解

    这篇文章主要给大家介绍了关于Golang信号处理及如何实现进程的优雅退出的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • 详解golang中的结构体编解码神器Mapstructure库

    详解golang中的结构体编解码神器Mapstructure库

    mapstructure是GO字典(map[string]interface{})和Go结构体之间转换的编解码工具,这篇文章主要为大家介绍一下Mapstructure库的相关使用,希望对大家有所帮助
    2023-09-09
  • 基于Go+OpenCV实现人脸识别功能的详细示例

    基于Go+OpenCV实现人脸识别功能的详细示例

    OpenCV是一个强大的计算机视觉库,提供了丰富的图像处理和计算机视觉算法,本文将向你介绍在Mac上安装OpenCV的步骤,并演示如何使用Go的OpenCV绑定库进行人脸识别,需要的朋友可以参考下
    2023-07-07
  • VsCode搭建Go语言开发环境的配置教程

    VsCode搭建Go语言开发环境的配置教程

    这篇文章主要介绍了在VsCode中搭建Go开发环境的配置教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05

最新评论