[golang]jwt生成与解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: [golang]jwt生成与解析

前言

golang-jwt是go语言中用来生成和解析jwt的一个第三方库,早先版本也叫jwt-go。本文中使用目前最新的v5版本。

安装

go get -u github.com/golang-jwt/jwt/v5

在代码中引用

import "github.com/golang-jwt/jwt/v5"

结构体

假设jwt原始的payload如下,username,exp为过期时间,nbf为生效时间,iat为签发时间。第一个是业务非敏感参数,后三者为jwt标准的参数。

{
  "username": "zhangsan",
  "exp": 1681869394,
  "nbf": 1681782994,
  "iat": 1681782994
}

对此编写结构体,其中jwt.RegisteredClaims包含了expnbfiat三个字段。

type User struct {
  Username string `json:"username"`
  jwt.RegisteredClaims  // v5版本新加的方法
}

生成jwt

入参为username和密钥,返回jwt的字符串和error。

func GenerateJWT(username, secretKey string) (string, error){
  claims := User{
    username,
    jwt.RegisteredClaims{
      ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)), // 过期时间24小时
      IssuedAt:  jwt.NewNumericDate(time.Now()), // 签发时间
      NotBefore: jwt.NewNumericDate(time.Now()), // 生效时间
    },
  }
  // 使用HS256签名算法
  t := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  s, err := t.SignedString([]byte(secretKey))
  return s, err
}

解析jwt

func ParseJwt(tokenstring, secretKey string) (*User, error) {
  t,err := jwt.ParseWithClaims(tokenstring, &User{}, func(token *jwt.Token) (interface{}, error) {
    return []byte(secretKey), nil
  })
  if claims,ok := t.Claims.(*User); ok && t.Valid {
    return claims, nil
  } else {
    return nil,err
  }
}

完整示例

package main
import (
  "fmt"
  "os"
  "time"
  "github.com/golang-jwt/jwt/v5"
)
type User struct {
  Username string `json:"username"`
  jwt.RegisteredClaims  // v5版本新加的方法
}
// 生成JWT
func GenerateJWT(username, secretKey string) (string, error) {
  claims := User{
    username,
    jwt.RegisteredClaims{
      ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)), // 过期时间24小时
      IssuedAt:  jwt.NewNumericDate(time.Now()), // 签发时间
      NotBefore: jwt.NewNumericDate(time.Now()), // 生效时间
    },
  }
  // 使用HS256签名算法
  t := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
  s, err := t.SignedString([]byte(secretKey))
  return s, err
}
// 解析JWT
func ParseJwt(tokenstring, secretKey string) (*User, error) {
  t,err := jwt.ParseWithClaims(tokenstring, &User{}, func(token *jwt.Token) (interface{}, error) {
    return []byte(secretKey), nil
  })
  if claims,ok := t.Claims.(*User); ok && t.Valid {
    return claims, nil
  } else {
    return nil,err
  }
}
func main() {
  var secretKey string = "qwertyuiop"
  s, err := GenerateJWT("zhangsan", secretKey)
  if err != nil {
    fmt.Println("generate jwt failed, ", err)
    os.Exit(1)
  }
  fmt.Printf("%s\n", s)
  
    // 解析jwt
  claims, err := ParseJwt(s, secretKey)
  if err != nil {
    fmt.Println("parse jwt failed, ", err)
    os.Exit(1)
  }
  fmt.Printf("%+v\n", claims)
}

参考

相关文章
|
5天前
|
存储 安全 Linux
Golang的GMP调度模型与源码解析
【11月更文挑战第11天】GMP 调度模型是 Go 语言运行时系统的核心部分,用于高效管理和调度大量协程(goroutine)。它通过少量的操作系统线程(M)和逻辑处理器(P)来调度大量的轻量级协程(G),从而实现高性能的并发处理。GMP 模型通过本地队列和全局队列来减少锁竞争,提高调度效率。在 Go 源码中,`runtime.h` 文件定义了关键数据结构,`schedule()` 和 `findrunnable()` 函数实现了核心调度逻辑。通过深入研究 GMP 模型,可以更好地理解 Go 语言的并发机制。
|
3月前
|
Go 开发者
|
3月前
|
监控 测试技术 API
|
3月前
|
编译器 Go 开发者
详尽解析:Golang 中的常量及其使用
【8月更文挑战第31天】
83 0
|
4月前
|
存储 JSON 安全
OAuth2与JWT在API安全中的角色:技术深度解析
【7月更文挑战第20天】OAuth2和JWT作为两种重要的安全协议,在API安全中发挥着不可或缺的作用。OAuth2通过提供灵活的授权框架,实现了对资源的细粒度访问控制;而JWT则通过其紧凑性和自包含性,确保了身份验证和信息传输的安全性。在实际应用中,将OAuth2和JWT结合使用,可以构建出既强大又安全的API服务,为用户提供更加安全、可靠和便捷的数字体验。
|
3月前
|
安全 Nacos 数据安全/隐私保护
【技术干货】破解Nacos安全隐患:连接用户名与密码明文传输!掌握HTTPS、JWT与OAuth2.0加密秘籍,打造坚不可摧的微服务注册与配置中心!从原理到实践,全方位解析如何构建安全防护体系,让您从此告别数据泄露风险!
【8月更文挑战第15天】Nacos是一款广受好评的微服务注册与配置中心,但其连接用户名和密码的明文传输成为安全隐患。本文探讨加密策略提升安全性。首先介绍明文传输风险,随后对比三种加密方案:HTTPS简化数据保护;JWT令牌减少凭证传输,适配分布式环境;OAuth2.0增强安全,支持多授权模式。每种方案各有千秋,开发者需根据具体需求选择最佳实践,确保服务安全稳定运行。
320 0
|
3月前
|
JSON 人工智能 算法
Golang 搭建 WebSocket 应用(四) - jwt 认证
Golang 搭建 WebSocket 应用(四) - jwt 认证
54 0
|
3月前
|
关系型数据库 API Go
[golang]在Gin框架中使用JWT鉴权
[golang]在Gin框架中使用JWT鉴权
104 0
|
3月前
|
缓存 移动开发 Go
golang bufio解析
golang bufio解析
26 0
|
5月前
|
Go
golang解析excel、csv编码格式
golang解析excel、csv编码格式
55 4