Обновленный токен аутентификации не сохраняется - PullRequest
0 голосов
/ 26 сентября 2019

Кажется, что мы столкнулись с проблемой, когда мы обновляем токены авторизации через ошибку, как описано в разделе «ОБНОВЛЕНИЕ СРОКОВ, ИСПОЛЬЗУЕМЫХ ИСПОЛЬЗОВАНИЕМ SOAP» на странице «Обработка токенов аутентификации» .Sonos получает новый токен и использует его для выполнения своего первоначального запроса, но затем возвращается к использованию старой информации токена.

Мы зафиксировали некоторый трафик, показывающий проблему, и смогли воспроизвести его несколько раз.

Сначала Sonos делает запрос, используя токен с истекшим сроком действия:

POST /soap HTTP/1.1
Connection: Keep-Alive
Content-Type: text/xml; charset="utf-8"
Accept-Encoding: gzip
Accept-Language: en-US
Host: <our_service>
Max-Forwards: 10
User-Agent: Linux UPnP/1.0 Sonos/52.13-69030 (ICRU_iPhone11,8)
X-Sonos-Controller-ID: 02A4****
X-Sonos-Api-Key: 4348****
X-Sonos-Corr-Id: c27c47ca-50c7-4a45-8c77-12c6b6a4415c
SOAPACTION: "http://www.sonos.com/Services/1.1#getMetadata"
X-FORWARDED-PROTO: https
X-FORWARDED-PORT: 443
X-ORIGINAL-HOST: <our_service>
X-Original-URL: /soap
X-Forwarded-For: ****
X-ARR-SSL: ****
X-ARR-LOG-ID: 203a446d-76ec-498d-b72d-ad8e61a0611e
Content-Length: 803

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <context xmlns="http://www.sonos.com/Services/1.1">
      <timeZone>-4:00</timeZone>
    </context>
    <credentials xmlns="http://www.sonos.com/Services/1.1">
      <loginToken>
        <token>95ce****</token>
        <key>{"Expires":"2019-09-24T18:33:58.7093084Z","RefreshToken":"ceaa****"}</key>
        <householdId>Sonos_sIGui81Pzu6Jny5L0ELN0WnJsG</householdId>
      </loginToken>
      <deviceId>78-28-CA-03-DA-40:B</deviceId>
      <deviceProvider>Sonos</deviceProvider>
    </credentials>
  </s:Header>
  <s:Body>
    <getMetadata xmlns="http://www.sonos.com/Services/1.1">
      <id>root</id>
      <index>0</index>
      <count>100</count>
    </getMetadata>
  </s:Body>
</s:Envelope>

Нашслужба распознает токен как просроченный и обновляет его:

HTTP/1.1 500 Internal Server Error
Content-Type: text/xml; charset="utf-8"
Server: Microsoft-IIS/10.0
Date: Wed, 25 Sep 2019 13:45:39 GMT
Content-Length: 554

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <s:Fault>
      <faultcode>Client.TokenRefreshRequired</faultcode>
      <faultstring>Auth Token Refreshed</faultstring>
      <detail>
        <refreshAuthTokenResult xmlns="http://www.sonos.com/Services/1.1">
          <authToken>d464****</authToken>
          <privateKey>{"Expires":"2019-09-25T14:45:39.2925349Z","RefreshToken":"a0ab****"}</privateKey>
        </refreshAuthTokenResult>
      </detail>
    </s:Fault>
  </s:Body>
</s:Envelope>

Sonos получает новый токен и использует его для выполнения своего первоначального запроса:

POST /soap HTTP/1.1
Connection: Keep-Alive
Content-Type: text/xml; charset="utf-8"
Accept-Encoding: gzip
Accept-Language: en-US
Host: <our_service>
Max-Forwards: 10
User-Agent: Linux UPnP/1.0 Sonos/52.13-69030 (ICRU_iPhone11,8)
X-Sonos-Controller-ID: 02A4****
X-Sonos-Api-Key: 4348****
X-Sonos-Corr-Id: 6f050fc0-027a-410c-8315-bf22486140a7
SOAPACTION: "http://www.sonos.com/Services/1.1#getMetadata"
X-FORWARDED-PROTO: https
X-FORWARDED-PORT: 443
X-ORIGINAL-HOST: <our_service>
X-Original-URL: /soap
X-Forwarded-For: ****
X-ARR-SSL: ****
X-ARR-LOG-ID: 745f02ac-60c7-440f-9c0c-620b73905b39
Content-Length: 803

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <context xmlns="http://www.sonos.com/Services/1.1">
      <timeZone>-4:00</timeZone>
    </context>
    <credentials xmlns="http://www.sonos.com/Services/1.1">
      <loginToken>
        <token>d464****</token>
        <key>{"Expires":"2019-09-25T14:45:39.2925349Z","RefreshToken":"a0ab****"}</key>
        <householdId>Sonos_sIGui81Pzu6Jny5L0ELN0WnJsG</householdId>
      </loginToken>
      <deviceId>78-28-CA-03-DA-40:B</deviceId>
      <deviceProvider>Sonos</deviceProvider>
    </credentials>
  </s:Header>
  <s:Body>
    <getMetadata xmlns="http://www.sonos.com/Services/1.1">
      <id>root</id>
      <index>0</index>
      <count>100</count>
    </getMetadata>
  </s:Body>
</s:Envelope>

Новый токен хорош, поэтомумы отвечаем информацией:

HTTP/1.1 200 OK
Content-Type: text/xml; charset="utf-8"
Server: Microsoft-IIS/10.0
Date: Wed, 25 Sep 2019 13:45:41 GMT
Content-Length: 4408

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <getMetadataResponse xmlns="http://www.sonos.com/Services/1.1">
      <getMetadataResult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <index>0</index>
        <count>1</count>
        <total>1</total>
        <mediaCollection>
          DATA
        </mediaCollection>
      </getMetadataResult>
    </getMetadataResponse>
  </s:Body>
</s:Envelope>

Пока все работает так, как ожидалось.Но затем, когда Sonos пытается сделать еще один запрос, он возвращается к старой информации аутентификации:

POST /soap HTTP/1.1
Connection: Keep-Alive
Content-Type: text/xml; charset="utf-8"
Accept-Encoding: gzip
Host: <our_service>
Max-Forwards: 10
User-Agent: Linux UPnP/1.0 Sonos/52.13-69030 (ZPS13)
X-Sonos-Corr-Id: 813f189e-8a70-41c2-8aaa-c1b117f6045d
SOAPACTION: "http://www.sonos.com/Services/1.1#getMetadata"
X-FORWARDED-PROTO: https
X-FORWARDED-PORT: 443
X-ORIGINAL-HOST: <our_service>
X-Original-URL: /soap
X-Forwarded-For: ****
X-ARR-SSL: ****
X-ARR-LOG-ID: 1158ddfa-df17-4f37-8843-1133566dacbe
Content-Length: 855

<?xml version="1.0"?>
<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-03-DA-40:B</deviceId>
      <deviceProvider>Sonos</deviceProvider>
      <loginToken>
        <token>95ce****</token>
        <key>{"Expires":"2019-09-24T18:33:58.7093084Z","RefreshToken":"ceaa****"}</key>
        <householdId>Sonos_sIGui81Pzu6Jny5L0ELN0WnJsG</householdId>
      </loginToken>
    </credentials>
    <context xmlns="http://www.sonos.com/Services/1.1">
      <timeZone>-4:00</timeZone>
    </context>
  </s:Header>
  <s:Body>
    <getMetadata xmlns="http://www.sonos.com/Services/1.1">
      <id>audiobook:18789269:791128</id>
      <index>0</index>
      <count>2147483647</count>
      <recursive>1</recursive>
    </getMetadata>
  </s:Body>
</s:Envelope>

Срок действия этого токена еще не истек, и этот токен обновления уже используется и отбрасывается, поэтому мы отвечаем:пользователь должен пройти повторную аутентификацию:

HTTP/1.1 500 Internal Server Error
Content-Type: text/xml; charset="utf-8"
Server: Microsoft-IIS/10.0
Date: Wed, 25 Sep 2019 13:45:43 GMT
Content-Length: 213

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <s:Fault>
      <faultcode>Client.AuthTokenExpired</faultcode>
      <faultstring>Error refreshing auth token</faultstring>
    </s:Fault>
  </s:Body>
</s:Envelope>

Мы не уверены, что происходит не так, как кажется, Sonos распознает наш ответ на обновление и использует новую информацию в первый раз.Есть ли что-то, что нам нужно сделать по-другому?

1 Ответ

0 голосов
/ 27 сентября 2019

Первый запрос поступает из приложения Sonos (обозначается ICRU_iPhone11,8 в пользовательском агенте).Ваша служба отправляет новые учетные данные в приложение, а приложение обновляет их и отправляет запрос вместе с ними.

Следующий запрос от игрока Sonos в домашнем хозяйстве (ZPS13 в пользовательском агенте).Плеер Sonos не имеет новой аутентификационной информации, поскольку приложение Sonos не копирует новые учетные данные игрокам.В этом случае вы должны обрабатывать несколько обновлений токенов, используя один и тот же токен обновления.Как только игрок получает новые учетные данные, он передает их другим игрокам и приложениям.

Если первый запрос поступил от плеера Sonos, проигрыватель отправляет новые учетные данные другим игрокам и приложениям.

Я обновлю документацию Обработка аутентификации для запросов API с этой информацией.

...