XBOX API:从XSTS令牌获取GS令牌时遭遇403权限拒绝错误求助
看起来你已经把整个授权流程拆解得非常细致了,卡在GS令牌这一步确实很让人沮丧。结合你描述的情况,我整理了几个可能的排查方向和调整建议,你可以逐一尝试:
1. 确认XSTS令牌的RelyingParty是否匹配GS令牌的要求
你提到只有http://xboxlive.com这个RelyingParty能返回有效XSTS,但GS令牌可能需要对应特定业务场景的RP值。建议尝试将XSTS请求的RelyingParty改为https://xhome.gssv-play-prod.xboxlive.com或者xhome(有些场景下用短标识),虽然你之前说其他RP返回空,但可能是参数组合的问题——比如确保SandboxId正确设为RETAIL,同时UserTokens格式无误。
2. 调整GS令牌请求的头部信息
你当前的GS请求头里缺少几个可能关键的字段:
- 加上
x-xbl-contract-version: 1(和XBL/XSTS请求保持一致) - 将
Origin和Referer改为https://www.xbox.com(和你之前XBL请求的头一致,部分API会验证来源) - 去掉手动设置的
Content-Length,让客户端自动处理,避免计算错误
调整后的请求头示例:
Headers: { 'x-xbl-contract-version': '1', 'Cache-Control': 'no-store, must-revalidate, no-cache', 'Content-Type': 'application/json', 'x-gssv-client': 'XboxComBrowser', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', 'Origin': 'https://www.xbox.com', 'Referer': 'https://www.xbox.com' }
3. 完善GS令牌请求的Body参数
尝试在Body中加入sandboxId字段,和XSTS请求保持一致:
{ "offeringId": "xhome", "token": "你的XSTS令牌", "sandboxId": "RETAIL" }
另外,如果你是要获取XGPU相关的GS令牌,可以尝试offeringId设为xgpu(而不是xgpuweb),有些文档里标注的官方标识是这个。
4. 验证XSTS令牌的权限范围
检查你获取的XSTS令牌中的prv字段,确认是否包含与GS服务相关的权限代码(比如和游戏订阅、家庭服务相关的权限)。如果缺少关键权限,可能需要在OAuth2授权步骤中添加更完整的scope——比如除了xboxlive.signin和xboxlive.offline_access,再加上XboxLive.GameStreaming或者XboxLive.Subscriptions这类相关scope(注意需要确保你的应用已经在Azure AD中配置了这些权限)。
5. 模拟官方请求的完整流程
最有效的调试方法是抓取Xbox官方网站(比如Xbox Game Pass网页端)获取GS令牌的实际请求:
- 打开浏览器开发者工具(F12),切换到Network标签
- 触发登录或加载Game Pass内容的操作,找到向
xhome.gssv-play-prod.xboxlive.com发送的POST请求 - 对比该请求的所有参数(头、Body、令牌格式)和你自己的请求,找出差异点
附上你提供的完整流程参考,方便后续排查:
已完成的正常步骤:
OAuth2授权获取Code
授权URL包含profile openid xboxlive.offline_access xboxlive.signin offline_access等scope交换Code获取Access Token
请求https://login.microsoftonline.com/consumers/oauth2/v2.0/token成功获取XBL User Token
POST https://user.auth.xboxlive.com/user/authenticate Headers: { 'x-xbl-contract-version': '1', 'Cache-Control': 'no-cache', 'Content-Type': 'application/json', 'Origin': 'https://www.xbox.com', 'Referer': 'https://www.xbox.com' } Body: { "Properties": { "AuthMethod": "RPS", "RpsTicket": "你的RPS票据", "SiteName": "user.auth.xboxlive.com" }, "RelyingParty": "http://auth.xboxlive.com", "TokenType": "JWT" }返回有效XBL令牌及
uhs标识获取XSTS Token
POST https://xsts.auth.xboxlive.com/xsts/authorize Headers: { 'x-xbl-contract-version': '1', 'Cache-Control': 'no-cache', 'Content-Type': 'application/json', 'Origin': 'https://www.xbox.com', 'Referer': 'https://www.xbox.com' } Body: { "Properties": { "SandboxId": "RETAIL", "UserTokens": ["你的XBL令牌"] }, "RelyingParty": "http://xboxlive.com", "TokenType": "JWT" }返回有效XSTS令牌及用户信息
出错的GS令牌请求:
POST https://xhome.gssv-play-prod.xboxlive.com/v2/login/user Headers: { 'Cache-Control': 'no-store, must-revalidate, no-cache', 'Content-Type': 'application/json', 'x-gssv-client': 'XboxComBrowser', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36' } Body: { "offeringId": "xhome", "token": "你的XSTS令牌" }
返回错误:
{ "code":"OfferingAccessDenied", "statusCode":403, "message":"" }
备注:内容来源于stack exchange,提问作者Jiri Zaloudek




