introduction
JWT:
- json jeton de bande, est une spécification
- Il se compose de trois parties
- tête-tête
- Payload PayLoad
- signature signature
- Utilisation . Pour la partie supérieure 3 est reliée
- « Jeton »: " ""." En-tête + + + + Signature PayLoad
Entête
l'action en-tête est utilisé pour indiquer l'algorithme de chiffrement utilisé pour signer le
{
"typ":"JWT",
"alg":"HS256"lag
}
Modifier généralement d'abord des données codées en base64 après épissage JSON
Charge utile
Payload pour stocker une partie des informations, ce qui devrait contenir des réclamations
réclamations
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 签名面向的用户
Dans lequel, si la définition exp
et iat
puis avec le dos jwt.Parse()
quand il vérifiera automatiquement si expiré
Après la première charge utile aussi généralement Base64 avant épissage ultérieure
Signature
Les algorithmes de chiffrement et l'application en-tête en-tête Payload données JSON (généralement la clé privée ainsi définie par l'utilisateur) par
JWT 包
aller chercher github.com/dgrijalva/jwt-go
utilisation
Générer un jeton
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 nil, err
}
return tokenString, nil
}
vérification jeton
Généralement utilisé comme middleware pour vérifier si l'utilisateur est légal
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
}
}
enfin
Jeton généré comme celui-ci
eyJfasghabgdsgI1NiIsInRfasfaVCJ9.eyJleHAiOjE1NDA2MDgyODgsdasaI6IllEUgasgasdaiwiYWRtaW4iOnRydWV9.8wE-_Wx-DHIqweXJ9KT5JOdasCEaUNEIGDy9CUbM