介绍
JWT:
- json web token,是一种规范
- 由三部分组成
- Header 头部
- PayLoad 有效载荷
- Signature 签名
- 使用 . 来连接上面的3部分
- “Token” : Header+"."+PayLoad+"."+Signature
Header
Header的作用是用来表明签名所使用的加密算法
{
"typ":"JWT",
"alg":"HS256"lag
}
通常会先将改json数据Base64编码后再拼接
PayLoad
有效载荷,用来存储一些信息,其中应该包含有 claims
claims
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"`
1. aud 标识token的接收者.
2. exp 过期时间.通常与Unix UTC时间做对比过期后token无效
3. jti 是自定义的id号
4. iat 签名发行时间.
5. iss 是签名的发行者.
6. nbf 这条token信息生效时间.这个值可以不设置,但是设定后,一定要大于当前Unix UTC,否则token将会延迟生效.
7. sub 签名面向的用户
其中 如果 定义了 exp
和iat
的话,在后面使用 jwt.Parse()
时,会自动校验是否过期
payload一般也会先经过Base64编码之后再进行后续拼接
Signature
通过Header申请的算法加密Header和Payload JSON数据(一般会加上用户自定义的私钥)
JWT包
go get github.com/dgrijalva/jwt-go
使用
生成token
import (
"time"
"github.com/dgrijalva/jwt-go"
)
var key string = "key"
func GenerateToken() (string, error) {
token := jwt.new(jwt.SigningMethodHS256)
claims := make(jwt.MapClaims)
claims["sub"] = 1 //用于在controller中确定用户
claims["exp"] = time.Now().Add(time.Hour.Truncate(72)) //设置过期时间为72小时后
clamis["iat"] = time.Now().Unix()//用作和exp对比的时间
token.Claims = claims
tokenString, err := token.SignedString([]byte(key))
if err != nil {
return “”, err
}
return tokenString, nil
}
验证token
一般用作中间件来验证用户是否合法
import (
"fmt"
"time"
"github.com/dgrijalva/jwt-go"
)
var key string = "key"
func AuthCheck(tokenString string) bool {
token := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error)) {
//验证是否是给定的加密算法
_, ok := token.Method.(*jwt.SigningMethodHMAC)
if !ok {
return false
}
return []byte(key)
})
if !token.Valid {
return false
} else {
claims := token.Claims.(jwt.MapClaims)
fmt.Println(claims["sub"])
return true
}
}
最后
生成的token 类似这样
eyJfasghabgdsgI1NiIsInRfasfaVCJ9.eyJleHAiOjE1NDA2MDgyODgsdasaI6IllEUgasgasdaiwiYWRtaW4iOnRydWV9.8wE-_Wx-DHIqweXJ9KT5JOdasCEaUNEIGDy9CUbM