一、什么是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
*/
评论区