附录
xlData 数据
xlData 是一个 JWT 字符串,其中的 payload 部分并未加密,可以直接从 JWT 字符串的 payload 解析出一个 JSON 对象。
同时,使用平台提供的签名密钥 sign_key
能够验证 JWT 数据的合法性。
浏览器如何解析 JWT 的 payload
// 参考代码,非唯一解决方案
const parseJwt = (token) => {
var base64Url = token.split(".")[1];
var base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/");
var jsonPayload = decodeURIComponent(
window
.atob(base64)
.split("")
.map(function (c) {
return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2);
})
.join("")
);
return JSON.parse(jsonPayload);
};
其它教程资源
xlData 的 payload 包含的参数
参数 | 类型 | 说明 |
---|---|---|
iss | string | 颁发方 |
sub | int | 平台的用户 ID |
exp | Int64 | token 有效期时间戳 |
jti | string | token 唯一标识 |
aud | string | 平台的游戏 ID |
user_info.nickname | string | 平台的用户昵称(gbk) |
user_info.avatar | string | 平台的用户头像 |
user_info.unickname | string | 平台的用户昵称(utf8) |
vip_info.level | int | 平台的 VIP 等级(0-10),值为 0 表示非 vip,没有特权 |
anti_addiction.appid | string | 国家防沉迷系统平台 appid |
anti_addiction.bizid | string | 国家防沉迷系统游戏 bizid |
从 JSON 对象生成 JWT 数据的示例
签名算法
HS256
签名秘钥
wHgo2ZClNlWpOYvV
HEADER
{
"alg": "HS256",
"typ": "JWT"
}
原始数据 payload
{
"anti_addiction": {
"appid": "",
"bizid": ""
},
"aud": "1432914199503179776",
"exp": 1635033600,
"iat": 1632837041,
"iss": "https://youxi.xunlei.com",
"nbf": 1632837041,
"sub": "c9f1f97b211d4b8a78b903d3e34d82b0",
"user_info": {
"avatar": "https://xfile2.a.88cdn.com/file/k/501/avatar/1536727441.jpg",
"nickname": "zzhh",
"unickname": "zzhh"
},
"vip_info": {
"level": 6
},
"alg": "HS256"
}
生成 jwt:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhbnRpX2FkZGljdGlvbiI6eyJhcHBpZCI6IiIsImJpemlkIjoiIn0sImF1ZCI6IjE0MzI5MTQxOTk1MDMxNzk3NzYiLCJleHAiOjE2MzUwMzM2MDAsImlhdCI6MTYzMjgzNzA0MSwiaXNzIjoiaHR0cHM6Ly95b3V4aS54dW5sZWkuY29tIiwibmJmIjoxNjMyODM3MDQxLCJzdWIiOiJjOWYxZjk3YjIxMWQ0YjhhNzhiOTAzZDNlMzRkODJiMCIsInVzZXJfaW5mbyI6eyJhdmF0YXIiOiJodHRwczovL3hmaWxlMi5hLjg4Y2RuLmNvbS9maWxlL2svNTAxL2F2YXRhci8xNTM2NzI3NDQxLmpwZyIsIm5pY2tuYW1lIjoienpoaCIsInVuaWNrbmFtZSI6Inp6aGgifSwidmlwX2luZm8iOnsibGV2ZWwiOjZ9LCJhbGciOiJIUzI1NiJ9.HXC56gq7zQa7RkHxm-XHTiHVqPWvCqvY4VJNrjfXvhs
提示
游戏方验证 JWT 的 sign 部分用到的 key 就是平台提供的签名密钥 sign_key
。