Интеграция API Homegraph в мой умный дом

В настоящее время я создаю автоматизацию умного дома. Я использую Laravel PHP в своем облаке. Я закончил аутентификацию Oauth2 и отправку команд из приложения Google Home на свои устройства (я использовал MQTT для связи со своими устройствами).

Я уже успешно реализовал SYNC, QUERY и EXECUTE. и теперь я хочу синхронизировать комнаты и структуры, для которых я должен использовать API Homegraph. Есть ли кто-нибудь, кто может помочь мне интегрировать Homegraph APi в мой Smarthome, потому что я столкнулся с проблемой здесь, в аутентификации JWT? Мое приложение основано на laravel, поэтому я не могу следовать примерам кода. Я пробовал так:

$jsonFile = json_decode(file_get_contents('./key.json'), true);
    $client = new \GuzzleHttp\Client();
    $payload = [
        "iss" => $jsonFile['client_email'],
        "scope" => "https://www.googleapis.com/auth/homegraph",
        "aud" => "https://accounts.google.com/o/oauth2/token",
        "iat" => date("h:i:sa"),
        "exp" => date("h:i:sa", strtotime('+1 hour'))
    ];
    $jwt = JWT::encode($payload, $jsonFile["private_key"], 'RS256');
    $header =  array("Authorization" => "Bearer " .  $jwt, "Content-Type" => "application/json");
    try {$response = $client->get( "https://accounts.google.com/o/oauth2/token", [
        "headers" => $header]);
    } catch (\Exception $e) {
        dd($e);
    }

я получаю сообщение об ошибке

    Client error: `GET https://accounts.google.com/o/oauth2/token` resulted in a `404 Not Found` response:
<!DOCTYPE html>
<html lang=en>
  <meta charset=utf-8>
  <meta name=viewport content="initial-scale=1, minimum-scale=1, w (truncated...)

я перехожу по этому http-сообщению по ссылке


person P7rck    schedule 27.01.2020    source источник
comment
Я бы предложил использовать библиотеку JWT, чтобы упростить интеграцию. Кроме того, похоже, что вы отправляете запрос GET, но, вероятно, хотите использовать запрос POST.   -  person Nick Felker    schedule 27.01.2020
comment
Я попытался использовать запрос POST и получил эту ошибку Client error: `POST https://accounts.google.com/o/oauth2/token` resulted in a `400 Bad Request` response: { "error": "unsupported_grant_type", "error_description": "Invalid grant_type: " } Я использую библиотеку firebase/php-jwt.   -  person P7rck    schedule 28.01.2020
comment
@NickFelker, у вас есть идеи, как я могу это решить? я выполнил шаги в Документация Homegraph и все еще не могу получить токены доступа .   -  person P7rck    schedule 02.02.2020
comment
Я бы посоветовал проверить библиотеку Google-auth PHP.   -  person Nick Felker    schedule 03.02.2020


Ответы (1)


Использование клиентской библиотеки API Google для PHP должно позволить вам напрямую интегрироваться с API Homegraph из реализации Smart Home на основе PHP без необходимости вручную обрабатывать HTTP-запрос и авторизацию.

Он может использовать учетные данные приложения Google по умолчанию для авторизуйте приложение с помощью ключа сервисной учетной записи:

putenv('GOOGLE_APPLICATION_CREDENTIALS=/path/to/key.json');

$client = new Google_Client();
$client->useApplicationDefaultCredentials();
$client->addScope("https://www.googleapis.com/auth/homegraph");

Он включает в себя сгенерированные привязки. для API Homegraph:

$homegraphService = new Google_Service_HomeGraphService($client);
$homegraphService->devices->reportStateAndNotification(...);

И генерируемые типы для всей полезной нагрузки запросов и ответов Homegraph API, например реализации отчета о состоянии будет выглядеть так:

$request = new Google_Service_HomeGraphService_ReportStateAndNotificationRequest();
$request->setAgentUserId("placeholder-user-id");
$request->setRequestId("placeholder-request-id");
$payload = new Google_Service_HomeGraphService_StateAndNotificationPayload();
$devices = new Google_Service_HomeGraphService_ReportStateAndNotificationDevice();
$devices->setStates(array(
    "placeholder-device-id" => array(
        "placeholder-state-key" => ...
    )
));
$payload->setDevices($devices);
$request->setPayload($payload);
$homegraphService->devices->reportStateAndNotification($request));

person proppy    schedule 22.07.2020