一、什么是jwt
JSON Web token简称JWT, 是用于对应用程序上的用户进行身份验证的标记。也就是说, 使用 JWT 的应用程序不再需要保存有关其用户的 cookie 或其他session数据。此特性便于可伸缩性, 同时保证应用程序的安全
jwt两个相关网站
二、格式
- 
JWT就是一个字符串,经过加密处理与校验处理的字符串,形式为:A.B.C 
- 
A由JWT头部信息header加密得到 
- 
B由JWT用到的身份验证信息json数据加密得到 
- 
C由A和B加密得到,是校验部分 
  
三、流程

四、jwt的使用
jwt-java
public class JwtUtils {
    // TOKEN的有效期1小时(S)
    private static final int TOKEN_TIME_OUT = 1 * 3600;
    // 加密KEY
    private static final String TOKEN_SECRET = "huihui";
    // 生成Token
    public static String getToken(Map params){
        long currentTime = System.currentTimeMillis();
        return Jwts.builder()
                .signWith(SignatureAlgorithm.HS512, TOKEN_SECRET) //加密方式
                .setExpiration(new Date(currentTime + TOKEN_TIME_OUT * 1000)) //过期时间戳
                .addClaims(params)
                .compact();
    }
    /**
     * 获取Token中的claims信息
     */
    public static Claims getClaims(String token) {
        return Jwts.parser()
                .setSigningKey(TOKEN_SECRET)
                .parseClaimsJws(token).getBody();
    }
    /**
     * 是否有效 true-有效,false-失效
     */
    public static boolean verifyToken(String token) {
      
        if(StringUtils.isEmpty(token)) {
            return false;
        }
        
        try {
            Claims claims = Jwts.parser()
                    .setSigningKey("huihui")
                    .parseClaimsJws(token)
                    .getBody();
        }catch (Exception e) {
            return false;
        }
      return true;
    }
}
jwt-go
import (
	"fmt"
	"github.com/dgrijalva/jwt-go"
	"time"
)
type MyClaims struct {
	UserName string `json:"username"`
	NumPhone string `json:"numphone"`
	jwt.StandardClaims
}
func main() {
	//我的密钥
	mySigningKey := []byte("qimiao")
	c := MyClaims{
		UserName: "qimiao",
		NumPhone: "17515088774",
		StandardClaims: jwt.StandardClaims{
			NotBefore: time.Now().Unix() - 60, //base64解成秒  60s
			ExpiresAt: time.Now().Unix() + 60*60*2,
			Issuer:    "qimiao",
		},
	}
	t := jwt.NewWithClaims(jwt.SigningMethodHS256, c)
	fmt.Println(t)
	s, e := t.SignedString(mySigningKey)
	if e != nil {
		fmt.Printf("%s", e)
	}
	fmt.Println(s)
	time.Sleep(2 * time.Second)
	token, err := jwt.ParseWithClaims(s, &MyClaims{}, func(token *jwt.Token) (interface{}, error) {
		return mySigningKey, nil
	})
	//fmt.Println(token)
	if err != nil {
		//fmt.Printf("%s", err)
		return
	}
	//fmt.Println(token.Claims) //&{qimiao { 1670990981  0 qimiao 1670983721 }}
	fmt.Println(token.Claims.(*MyClaims).UserName)
}
/*输出
&{ 0xc000004120 map[alg:HS256 typ:JWT] {qimiao 17516072449 { 1671256316  0 qimiao 1671249056 }}  false}
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InFpbWlhbyIsIm51bXBob25lIjoiMTc1MTYwNzI0NDkiLCJleHAiOjE2NzEyNTYzMTYsImlzcyI6InFpbWlhbyIsIm5iZiI6MTY3MTI0OTA1Nn0.ws-uoqnrllg2-VOP
OCS5ZXVqbYuPbxQHid8N1lkGaiQ
qimiao
*/
 
       
         
      
评论区