Sonos SMAPI:getLastUpdate 和 getMediaUri 响应中忽略了 AuthTokenExpired 故障

Sonos SMAPI : AuthTokenExpired faults ignored in getLastUpdate and getMediaUri response

我们正在整合 Sonos API。 我们选择不实施令牌刷新,因此我们的令牌会持续 1 年,直到用户必须再次重新授权。

在我的测试期间,当浏览时出现 AuthTokenExpired 故障(响应 getMetadata)时,我成功地获得了重新授权弹出窗口。

但是每次从对 getMediaMetadata 的调用中 return 出现故障时,我都会收到默认错误消息 "Unable to play the radio station"。我希望看到重新授权弹出窗口。

引用自Sonos documentation about authentication tokens

If you do not implement refresh tokens, when the token expires, return the Client.AuthTokenExpired fault to indicate the user must manually log in and authenticate again. The Log-Message is a string placed in the log messages for this fault code.

这是我们的 SMAPI 服务器和 Sonos application/speaker 之间有问题的对话:

31/03/2020 14:24:27 641 SonosApi    Request http://www.sonos.com/Services/1.1#getMediaMetadata  "<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
  <credentials xmlns="http://www.sonos.com/Services/1.1">
    <deviceId>78-28-CA-9F-86-8E:8</deviceId>
    <deviceProvider>Sonos</deviceProvider>
    <loginToken>
      <token>1fa35465a-6bbc-4cf4-b46f-0e12be5b3216</token>
      <householdId>Sonos_W6VyCDwgI8ZadAWceKQ1avPrtd</householdId>
    </loginToken>
  </credentials>
  <To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://dev8.local.st-corp.fr:8001/SonosService.svc</To>
  <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://www.sonos.com/Services/1.1#getMediaMetadata</Action>
</s:Header>
<s:Body>
  <getMediaMetadata xmlns="http://www.sonos.com/Services/1.1">
    <id>14740</id>
  </getMediaMetadata>
</s:Body>
</s:Envelope>"


31/03/2020 14:24:27 875 SonosApi    Reply   "<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header />
<s:Body>
  <s:Fault>
    <faultcode>s:Client.AuthTokenExpired</faultcode>
    <faultstring xml:lang="fr-FR">The token is expired</faultstring>
  </s:Fault>
</s:Body>
</s:Envelope>"

编辑:

参考更新后的文档和您的回答,我应该 return 在调用 getMetadata 和 getMediaUri 时出现 AuthTokenExpired 错误。

但是知道访问令牌已过期,我应该如何回答对 getMediaMetadata 的调用?

查看我的消息日志,我看到当用户单击可流项目时,将按以下顺序进行以下调用:

  1. getMediaMetadata(知道令牌已经过期的答案是什么?)
  2. getMediaUri(此处应处理AutTokenExpired)

如果我错了请纠正我,但为了建立对 getMediaUri 的调用,Sonos 客户端使用了上次调用 getMediaMetadata 时得到的 ID returned,我无法提供它,因为令牌已经过期了。在 getMediaMetadata 中先处理 AuthTokenExpired 不是更好吗?

此致

浏览 (getMetadata) 和 getMediaURI 调用将遵循 AuthTokenExpired 错误。这些调用的重新授权流程如 Use authentication tokens 文档的 刷新过期身份验证令牌 部分所述。我将更新文档以反映这一点。

如果这不起作用,请提交诊断以对其进行调试。有关说明,请参阅 support.sonos.com/s/article/141。复制您的诊断编号并将其连同时间 window、Sonos 家庭 ID 和您的 Whosebug 用户名通过电子邮件发送至 developer-feedback@sonos.com。

您提到当您发送故障以响应 getMediaURI 时,您会收到一条错误消息,但您的示例显示了一个 getMediaMetadata 调用。

当您的服务器 returns AuthTokenExpired 故障 getLastUpdate 时,Sonos 不会启动重新授权向导。当 Sonos 扬声器发出 getMediaMetadata 呼叫但失败时,它不会开始播放。用户还会看到播放失败。