- **令牌配置:**令牌中的声明;令牌生命周期
- **加密密钥:**用于加密令牌的密钥
- **签名策略:**指定必须签名以进行完整性验证的请求部分(标头和/或正文)
具有多个用户的令牌
对于 XBOX,令牌包含当前登录到控制台的任何用户的用户身份。令牌中的xui 声明是一个数组,其中包含一个或多个这些用户对象。传入的请求具有以下格式的授权标头:
XBL3.0 x=<user hash>;<token>
用户哈希值是以下三个值之一。
- 与令牌中某个用户身份的用户哈希声明匹配的数字,表明该请求针对该特定用户。
- 星号 (*),表示该请求针对令牌中包含的所有用户。
- 连字符 (-),表示该请求不在令牌中任何用户的上下文中。
令牌结构
XSTS 令牌使用带有加密有效负载的自定义 JSON Web 令牌 (JWT) 格式,该有效负载称为外部令牌。 该格式遵循 JWT RFC 7519,并具有两个其他部分以便于对有效负载进行解密。 令牌的每个部分在编码令牌字符串中由一个句点分隔。 一旦解密,有效负载是标准的 JSON Web 令牌 (JWT RFC 7519),称为内部令牌。 内部令牌包含来自相应信赖方配置的声明和身份验证信息。 有关分解为这些不同部分和区段的示例令牌,请参阅 XBOX services 安全令牌示例。
具有上述所有区段的 XSTS 令牌的最大大小为 64 KB。
外部令牌加密
外部令牌使用两个加密密钥来保护内部令牌及其声明。 首先,有效负载使用生成 XSTS 令牌时创建的内容加密密钥进行加密。 然后,此内容加密密钥本身使用与令牌所创建的相应信赖方绑定的非对称公共证书密钥进行加密。 配置信赖方时,此公共证书密钥会上传到 Partner Center。 要访问表示内部令牌的解密有效负载,服务必须:- 检查外部令牌的 x5t 标头以获取用于加密内容加密密钥的证书的缩略图
- 使用信赖方的私有证书密钥解密内容加密密钥
- 使用内容加密密钥和初始化向量解密外部令牌有效负载
旧版加密和令牌格式
某些游戏和发行商可能仍在使用较旧的旧版 XSTS 令牌格式,该格式不遵循 JWT RFC 7519 格式。 此选项仅适用于从 XBOX 开发人员门户 (XDP) 迁移的游戏或出于兼容性目的需要此格式的游戏。 新令牌配置不应使用此 JWT 格式。 此外,Partner Center 以前包含对称共享密钥加密选项。 由于安全问题,此选项已弃用,不可用于新的信赖方配置。内部令牌
在有效负载解密后,它是一个 UTF8 数组,表示遵循 JWT RFC 7516 的内部令牌。 内部令牌的有效负载包含为创建令牌所针对的信赖方配置的声明。 未在 Partner Center 为信赖方配置的声明不会包含在令牌有效负载中。 声明值可以是传统类型(例如,字符串、整数和 GUID)。 它们也可以是表示更复杂结构的 JSON 对象。 有关更多信息,请参阅 XBOX services 安全令牌声明。没有数据的声明值可以通过 null 值表示,或者可以完全从令牌中缺失。游戏服务在解析声明值时应考虑到这一点。
内部令牌标头和签名验证
内部令牌具有一个标头,其中包含与生成和验证内部令牌签名相关的信息。 此签名验证证明令牌来自 XBOX Live 服务,并且未被篡改。 当前有两种支持的密钥类型用于生成验证签名,并可以在 Partner Center 为您的信赖方进行配置:- 当前的 XSTS 签名 JWK(JSON Web 密钥)
- 当前的 XSTS 签名证书
使用 XSTS JKW 签名密钥
如果您的信赖方配置了 JKU 选项,则您的令牌使用当前的 XSTS 签名 JWK,并在内部令牌中具有以下标头值:在您的服务下载新的签名密钥之前,请验证 jku URL 是否属于 xsts-keys.auth.xboxlive.com 域。如果不是,应拒绝该令牌并且不应下载密钥。
使用 XSTS 签名证书
如果您的信赖方在 Partner Center 中没有启用 JKU 选项,则您的令牌使用当前的 XSTS 签名证书,并在内部令牌中具有以下标头值:即使您的信赖方未配置为 JKU / KID,这些声明也会出现在您的内部令牌标头中。这些值反映 x5t 和 x5u 的值。
在您的服务下载新的签名证书密钥之前,请验证来自 x5u 或 jku 的 URL 是否属于 xsts.auth.xboxlive.com 域。如果不是,应拒绝该令牌并且不应下载证书。
4.1.5 “x5u” (X.509 URL) 标头参数 “x5u” (X.509 URL) 标头参数是一个 URI [RFC3986],它引用了对应于用于对 JWS 进行数字签名的密钥的 X.509 公钥证书或证书链 [RFC5280] 的资源。所标识的资源必须提供符合 RFC 5280 [RFC5280] 的 PEM 编码形式的证书或证书链表示,每个证书按 RFC 4945 [RFC4945] 第 6.1 节所述进行分隔。包含对应于用于对 JWS 进行数字签名的密钥的公钥的证书必须是第一个证书。该证书之后可能跟随其他证书,每个后续证书都是用于对前一个证书进行认证的证书。用于获取资源的协议必须提供完整性保护;用于检索证书的 HTTP GET 请求必须使用 TLS [RFC2818] [RFC5246];服务器的身份必须按照 RFC 6125 [RFC6125] 第 6 节进行验证。 另请参阅第 8 节中的 TLS 要求。使用此标头参数是可选的。
