Мы интегрируем Sonos API. Мы решили не использовать токен refre sh, и поэтому наши токены будут действовать в течение 1 года, пока пользователю не потребуется повторная авторизация.
Во время моих тестов я успешно получаю всплывающее окно повторной авторизации, когда ошибка AuthTokenExpired возвращается, пока просматриваю (в ответ на getMetadata).
Но каждый раз, когда ошибка возвращается из вызова getMediaMetadata, я получаю сообщение об ошибке по умолчанию «Невозможно воспроизвести радиостанцию». Вместо этого я ожидаю увидеть всплывающее окно повторной авторизации.
Цитирование из Документации Sonos о токенах аутентификации :
Если вы не внедрили токены refre sh, когда срок действия токена истечет, верните ошибку Client.AuthTokenExpired, чтобы указать, что пользователь должен вручную войти в систему и снова пройти аутентификацию. Сообщение журнала - это строка, помещенная в сообщения журнала для этого кода ошибки.
Вот проблемный диалог c между нашим сервером SMAPI и приложением / динамиком Sonos:
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>"
Редактировать:
Ссылаясь на обновленную документацию и ваш ответ, я должен возвращать только ошибку AuthTokenExpired в вызовах getMetadata и getMediaUri.
Но что я должен ответить на вызов, зная getMediaMetadata что маркер доступа устарел?
Просматривая журналы моих сообщений, я вижу, что когда пользователь щелкает элемент с возможностью стриминга, выполняются следующие вызовы в следующем порядке:
- getMediaMetadata (каков будет ответ, зная, что токен уже истек?)
- getMediaUri (здесь следует обрабатывать AutTokenExpired)
Исправьте меня, если я ошибаюсь, но чтобы Создайте вызов getMediaUri, клиент Sonos использует идентификатор, полученный из последнего вызова getMediaMetadata, который я не могу предоставить, потому что токен п уже истек. Не лучше ли сначала обработать AuthTokenExpired в getMediaMetadata?
С уважением