侧边栏壁纸
博主头像
SeaDream乄造梦

Dream,Don't stop a day of hard and don't give up a little hope。 ——不停止一日努力&&不放弃一点希望。

  • 累计撰写 40 篇文章
  • 累计创建 20 个标签
  • 累计收到 13 条评论

目 录CONTENT

文章目录

jwt原理 过程 代码

SeaDream乄造梦
2022-12-17 / 0 评论 / 0 点赞 / 529 阅读 / 2,318 字
温馨提示:
亲爱的,如果觉得博主很有趣就留下你的足迹,并收藏下链接在走叭

一、什么是jwt

JSON Web token简称JWT, 是用于对应用程序上的用户进行身份验证的标记。也就是说, 使用 JWT 的应用程序不再需要保存有关其用户的 cookie 或其他session数据。此特性便于可伸缩性, 同时保证应用程序的安全

jwt两个相关网站

jwt.io

在线加密解密

二、格式

  • JWT就是一个字符串,经过加密处理与校验处理的字符串,形式为:A.B.C

  • A由JWT头部信息header加密得到

  • B由JWT用到的身份验证信息json数据加密得到

  • C由A和B加密得到,是校验部分
    image.png

三、流程

image.png

四、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
*/


0

评论区