jwt-go使用 | 青训营

117 阅读2分钟

大项目的要求接口很多都需要使用Token去验证用户权限以及登录状态,所以在实现用户登录、注册相关接口时,就想着把jwt整合进项目中,jwt-go是一个采用go实现的jwt库,下面来学习一下基本使用。

JWT基础

jwt由三部分组成

  • Header
  • Payload
  • Signature 这三部以.连接,组成一个完整的JWT

Header

Header一般包含两个两个部分,token的类型(这里为JWT),使用的加密算法(RSA、SHA256等)

{ "alg": "HS256", "typ": "JWT" }

Payload

Payload中包含claims,其中附带信息,有三种类型:

  • Registered claims:这是jwt已经预定义的一组claims,常用的过期时间(expiration time)属于这一部分。jwt制定了详细的验证规则
  • Public claim:略
  • Private claims:用户自行定义的claims属于这一类型,为了避免冲突不能与Registered claims重复。jwt不会主动验证
{ "sub": "1234567890", "name": "John Doe", "admin": true }

Signature

Signature用户自定的jwt签名,一个完整的使用HMAC SHA256加密的jwt如下所示

HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload) + "." + secret)

jwt-go使用

安装

  1. 下载
go get -u github.com/golang-jwt/jwt/v5
  1. 引入
import "github.com/golang-jwt/jwt/v5"

构建jwt

假如我们想使用用户名作为claims以此去创建jwt,我们需要先定义一个结构体

type MyClaims struct {
    Name string
    jwt.RegisteredClaims // jwt预定义的claims
}

接着使用HS256加密算法创建jwt,并设置过期时间为1个小时。

claims := MyClaims {
    "Jack"
    jwt.RegisteredClaims{
        ExpiresAt: jwt.NewNumericDate(time.Now().Add(Time.Hour))
    }
}
jwt := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)

最后给jwt附加一个签名,这里需要注意的是不同加密算法,对签名的数据类型要求不一样,例如HS256需要[]byte类型的签名。

signature := "code!!!"
token, _ := token.SignedString([]byte(signature))

解析jwt

假如已经拥有一个jwt该如何进行解析呢

parseedToken, _ := jwt.ParseWithClaims(
        token, 
        &MyClaims{}, 
        func(token *jwt.Token) (interface{}, error) {
        // 解析完成的回调函数,可以进行额外验证
                return []byte("AllYourBase"), nil
        }
)
if claims, ok := parseedToken.Claims.(*MyClaims); ok && token.Valid {
    // 验证成功
} else {
    // 验证失败
}