跳到主要内容

附录

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);
};

参考资料:https://stackoverflow.com/questions/38552003/how-to-decode-jwt-token-in-javascript-without-using-a-library/38552302#38552302

xlData 的 payload 包含的参数

参数类型说明
issstring颁发方
subint平台的用户 ID
expInt64token 有效期时间戳
jtistringtoken 唯一标识
audstring平台的游戏 ID
user_info.nicknamestring平台的用户昵称(gbk)
user_info.avatarstring平台的用户头像
user_info.unicknamestring平台的用户昵称(utf8)
vip_info.levelint平台的 VIP 等级(0-10),值为 0 表示非 vip,没有特权
anti_addiction.appidstring国家防沉迷系统平台 appid
anti_addiction.bizidstring国家防沉迷系统游戏 bizid

从 JSON 对象生成 JWT 数据的示例

签名算法

HS256

签名秘钥

wHgo2ZClNlWpOYvV

{
"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