Golang语言使用 jwt-go 库生成和解析 token

简介: Golang语言使用 jwt-go 库生成和解析 token

01

介绍


JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种方式,用于在各方之间安全地将信息作为 JSON 对象传输。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用秘密(使用 HMAC 算法)或使用 RSA 或 ECDSA 的公钥/私钥对对 JWT 进行签名。


尽管可以对 JWT 进行加密以提供双方之间的保密性,但我们将重点关注已签名的令牌(signed tokens)。签名的令牌可以验证其中包含的声明的完整性,而加密的令牌则将这些声明隐藏。当使用公钥/私钥对对令牌进行签名时,签名还证明只有持有私钥的一方才是对其进行签名的一方。


因为本文主要是介绍 jwt-go 库的使用方法,所以关于 jwt 的内容不再深入介绍,感兴趣的读者,如果想要了解更多关于 JWT 的内容,可以访问 jwt.io。


安装 jwt-go


go get -u github.com/dgrijalva/jwt-go@v3.2.0


02

生成 token


使用 jwt-go 库生成 token,我们需要定义需求(claims),也就是说我们需要通过 jwt 传输的数据。假如我们需要传输 ID 和 Username,我们可以定义 Claims 结构体,其中包含 ID 和 Username 字段,还有在 jwt-go 包预定义的 jwt.StandardClaims。


type Claims struct {
  ID       int64
  Username string
  jwt.StandardClaims
}


jwt.StandardClaims 包含的字段:


type StandardClaims struct {
  Audience  string `json:"aud,omitempty"`
  ExpiresAt int64  `json:"exp,omitempty"`
  Id        string `json:"jti,omitempty"`
  IssuedAt  int64  `json:"iat,omitempty"`
  Issuer    string `json:"iss,omitempty"`
  NotBefore int64  `json:"nbf,omitempty"`
  Subject   string `json:"sub,omitempty"`
}


其中 ExpiresAt 和 Issuer 分别是过期时间和签发者。

使用 jwt-go 库根据指定的算法生成 jwt token ,主要用到两个方法:


jwt.NewWithClaims 方法:


func jwt.NewWithClaims(method jwt.SigningMethod, claims jwt.Claims) *jwt.Token


jwt.NewWithClaims 方法根据 Claims 结构体创建 Token 示例。

参数 1 是 jwt.SigningMethod,

其中包含

jwt.SigningMethodHS256,

jwt.SigningMethodHS384,

jwt.SigningMethodHS512

三种 crypto.Hash 加密算法的方案。

参数 2 是 Claims,包含自定义类型和 StandardClaim,StandardClaim 嵌入在自定义类型中,以方便对标准声明进行编码,解析和验证。


SignedString 方法:


func (*jwt.Token).SignedString(key interface{}) (string, error)


SignedString 方法根据传入的空接口类型参数 key,返回完整的签名令牌。


示例代码:


func GenerateToken() (string, error) {
  nowTime := time.Now()
  expireTime := nowTime.Add(300 * time.Second)
  issuer := "frank"
  claims := MyCustomClaims{
    ID:       10001,
    Username: "frank",
    StandardClaims: jwt.StandardClaims{
      ExpiresAt: expireTime.Unix(),
      Issuer:    issuer,
    },
  }
  token, err := jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString([]byte("golang"))
  return token, err
}


03

解析 token


使用 jwt-go 库解析 token,主要用到两个方法,分别用通过与解析传入的 token 字符串,和根据 MyCustomClaims 结构体定义的相关属性要求进行校验。


jwt.ParseWithClaims 方法:


func jwt.ParseWithClaims(tokenString string, claims jwt.Claims, keyFunc jwt.Keyfunc) (*jwt.Token, error)


jwt.ParseWithClaims 方法用于解析鉴权的声明,返回 *jwt.Token。


Valid 方法用于校验鉴权的声明。


示例代码:


func ParseToken(token string) (*MyCustomClaims, error) {
  tokenClaims, err := jwt.ParseWithClaims(token, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) {
    return []byte("golang"), nil
  })
  if err != nil {
    return nil, err
  }
  if tokenClaims != nil {
    if claims, ok := tokenClaims.Claims.(*MyCustomClaims); ok && tokenClaims.Valid {
      return claims, nil
    }
  }
  return nil, err
}


04

总结


本文开头介绍了什么是 JWT,和怎么安装 jwt-go 库。然后通过生成 token 和解析 token 两个示例,介绍了其中需要用到的四个方法。jwt-go 库还有很多其他方法,限于篇幅,没有一一介绍。感兴趣的读者,可以阅读 jwt-go 库的文档进一步了解。





目录
相关文章
|
3天前
|
存储 算法 Go
go语言并发实战——日志收集系统(七) etcd的介绍与简单使用
go语言并发实战——日志收集系统(七) etcd的介绍与简单使用
|
3天前
|
监控 Go
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
go语言并发实战——日志收集系统(八) go语言操作etcd以及利用watch实现对键值的监控
|
2天前
|
Go
Go 语言是如何实现切片扩容
Go 语言是如何实现切片扩容
|
2天前
|
NoSQL Go Redis
如何使用 Go 和 `go-redis/redis` 库连接到 Redis 并执行一些基本操作
如何使用 Go 和 `go-redis/redis` 库连接到 Redis 并执行一些基本操作
8 1
|
3天前
|
存储 Go
Go 语言当中 CHANNEL 缓冲
Go 语言当中 CHANNEL 缓冲
|
3天前
|
中间件 Go
go语言后端开发学习(三)——基于validator包实现接口校验
go语言后端开发学习(三)——基于validator包实现接口校验
|
3天前
|
消息中间件 存储 监控
go语言并发实战——日志收集系统(六) 编写日志收集系统客户端
go语言并发实战——日志收集系统(六) 编写日志收集系统客户端
|
3天前
|
消息中间件 存储 Kafka
go语言并发实战——日志收集系统(二) Kafka简介
go语言并发实战——日志收集系统(二) Kafka简介
|
3天前
|
存储 Go 开发工具
go语言后端开发学习(二)——基于七牛云实现的资源上传模块
go语言后端开发学习(二)——基于七牛云实现的资源上传模块
|
3天前
|
JSON 算法 Go
go语言后端开发学习(一)——JWT的介绍以及基于JWT实现登录验证
go语言后端开发学习(一)——JWT的介绍以及基于JWT实现登录验证

热门文章

最新文章