Процесс спаривания, как понятно из онлайн-ресурсов и сценария Python (philips_android_tv-master/philips.py), включает в себя эти основные шаги:
- post to/6/pare/request :
- Payload: {"Scope": [Read "," write "," управление "]," Device_: "Device_": ",", ",", ",": ",": ",", ":", ":", ":", ",": ",": ",": ",": ",": ",": ",", ":", ":", ":", ",": ":": ",": ",": ",": ",": ",": ",", ":", ":": ",": ",", ":", ":" "...", "app_id": "...", "app_name": "...", "type": "Native", "id": "client_generated_id"}}
- TV отвечает 200 OK и корпусом JSON, содержащим auth_key и timempame . На экране телевизора появляется PIN -код. Аутентификация: для этого запроса требуется аутентификация HTTP Digest.
Имя пользователя: client_generated_id от шага 1. - Пароль: auth_key Полезная нагрузка: < /strong>
{
"auth": {
"pin": "USER_ENTERED_PIN",
"auth_timestamp": TIMESTAMP_FROM_STEP_1, // Sent as a number
"auth_signature": "CALCULATED_HMAC_SIGNATURE",
"auth_AppId": "1" // Or 1 as number
},
"device": { /* Same device object as in /pair/request */ }
}
< /code>
< /li>
HMAC Signature (auth_signature): рассчитывается как base64.encode (utf8_bytes (hexstring (hmac_sha1 (decoded_secret_key, utf8_bytes (timestamp_string + pin_string)))) . Secret_key является известной фиксированной строкой Base64.
Оба My Android -приложение и сценарий Python. Пара Code:
/timestamp получена.
[*] Первая попытка опубликовать в/6/pare/grant (без авторизации заголовок в моем приложении или обработанной по запросам библиотеки в Python) правильно получает 401 unauthorified tv. Www-authenticate заголовок: digest realm = "xtv", nonce = "some_nonce", qop = "auth" (no opaque Параметр).
[*] как мое приложение, так и сценарий Python, затем правильно рассчитывать Autwortization headse used ewortization и телевизор AUTH_KEY как пароль.
[*] Второй запрос на пост в/6/pare/Grant (с той же полезной нагрузкой JSON, но теперь включает в себя авторизацию: Digest ... Header) получает 200 ok Code. {"error_id": "Invalid_pin", "error_text": "Неверные параметры аутентификации"} как для моего приложения, так и для скрипта Python.
то, что я проверял:
. Работа: Получение 200 OK на Second/Pair/Grant Попытка указывает, что телевизор принимает учетные данные. Скрипт Python с использованием идентичной временной метки , pin и secret_key входы. Конечная строки Base64 auth_signature - идентичные .
[*] Пример Python (timestamp = "2527", pin = "8763"): auth_signature = "ztkwmwe4mtqyndhmmmzdkzdaznwrjmjy1yzfmm2vlzwvim2jlytgyna =="
[*] my java -код с теми же входными данными дает одну и ту же строку Base64. /> Структура полезной нагрузки JSON: < /strong>
- auth_timestamp отправляется в виде числового значения (долго в Java, int in Python) в JSON.
- auth_AppId отправляется как числовое 1 .
- Объект в полезной нагрузке для/pare/Grant использует тот же идентификатор (сгенерированный клиентом), как и в /пейр /рекест. app_id из официальных журналов удаленного приложения Philips TV в моем устройстве json объект для обоих/pair/request и/pare/rant . Это не изменило результат "vallid_pin". Приложение делает. Это также не изменило результат «vangilid_pin» для /пейр/графы/code>.
фрагмент скрипта Python (исправлено и ведение журнала):
Подробнее здесь: https://stackoverflow.com/questions/796 ... h-but-json