You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

XBOX API:从XSTS令牌获取GS令牌时遭遇403权限拒绝错误求助

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请求保持一致)
  • OriginReferer改为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.signinxboxlive.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、令牌格式)和你自己的请求,找出差异点

附上你提供的完整流程参考,方便后续排查:

已完成的正常步骤:

  1. OAuth2授权获取Code
    授权URL包含profile openid xboxlive.offline_access xboxlive.signin offline_access等scope

  2. 交换Code获取Access Token
    请求https://login.microsoftonline.com/consumers/oauth2/v2.0/token成功

  3. 获取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标识

  4. 获取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

火山引擎 最新活动