脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Golang - 在Go中使用jwt的教程详解

在Go中使用jwt的教程详解

2024-06-13 17:16uccs Golang

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的资料请关注服务器之家其它相关文章!

原文链接:https://juejin.cn/post/7379416139976163391

延伸 · 阅读

精彩推荐
  • Golanggo语言匿名函数的使用

    go语言匿名函数的使用

    今天小编就为大家分享一篇关于go语言匿名函数的使用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    itdada4132020-05-25
  • GolangGo获取与设置环境变量的方法详解

    Go获取与设置环境变量的方法详解

    go环境变量的配置其实说真的说难也难,说不难也不难,只要配置成功过一次以后后面都很简单,但是最好是要做好笔记,这篇文章主要给大家介绍了关于Go获取...

    polarisxu12502021-11-26
  • Golanggolang gin框架实现大文件的流式上传功能

    golang gin框架实现大文件的流式上传功能

    这篇文章主要介绍了golang gin框架中实现大文件的流式上传,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要...

    ahfuzhang11642022-10-28
  • GolangGo结合反射将结构体转换成Excel的过程详解

    Go结合反射将结构体转换成Excel的过程详解

    这篇文章主要介绍了Go结合反射将结构体转换成Excel的过程详解,大概思路是在Go的结构体中每个属性打上一个excel标签,利用反射获取标签中的内容,作为表...

    范闲5672022-10-14
  • Golang一例 Go 编译器代码优化 bug 定位和修复解析

    一例 Go 编译器代码优化 bug 定位和修复解析

    本文中介绍了 Go 编译器的整体编译流程脉络和一个编译优化错误导致数据越界访问的 bug,并分析了对这个 bug 的排查和修复过程,希望能够借此让大家对...

    今日头条2072020-11-10
  • Golang解决goland新建项目文件名为红色的问题

    解决goland新建项目文件名为红色的问题

    这篇文章主要介绍了解决goland新建项目文件名为红色的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    doNotTellU16382021-02-24
  • Golang利用Go语言实现轻量级OpenLdap弱密码检测工具

    利用Go语言实现轻量级OpenLdap弱密码检测工具

    这篇文章主要为大家详细介绍了如何利用Go语言实现轻量级OpenLdap弱密码检测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以尝试一下...

    Marionxue10312022-11-17
  • GolangGOLANG使用Context管理关联goroutine的方法

    GOLANG使用Context管理关联goroutine的方法

    这篇文章主要介绍了GOLANG使用Context管理关联goroutine的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋...

    winlin6252020-05-22