не удалось сообщить о состоянии из-за несанкционированного действия Google Home

Я отправляю запрос о состоянии отчета в моем onExecute обработчике. Это не работает с:

io.grpc.StatusRuntimeException: UNAUTHENTICATED: Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.
   at io.grpc.stub.ClientCalls.toStatusRuntimeException(ClientCalls.java:233)
   at io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:214)
   at io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:139)
   at com.google.home.graph.v1.HomeGraphApiServiceGrpc$HomeGraphApiServiceBlockingStub.reportStateAndNotification(HomeGraphApiServiceGrpc.java:425)
   at com.google.actions.api.smarthome.SmartHomeApp.reportState(SmartHomeApp.kt:132)
[snip]

Я не понимаю, как это возможно, поскольку я использую SmartHomeApp для выполнения запроса, тот же SmartHomeApp, который получает синхронизацию, запрос, выполнение, отключение. Вот мой код:

var state = new HashMap();
state.put("openPercent", 50); // etc
SmartHomeApp app = ... // this is what received the onExecute
app.reportState(ReportStateAndNotificationRequest.newBuilder()
    .setRequestId(request.requestId) // onExecute requestId
    .setAgentUserId(userId) // hardcoded user
    .setPayload(StateAndNotificationPayload.newBuilder()
        .setDevices(ReportStateAndNotificationDevice.newBuilder()
            .setStates(Struct.newBuilder()
                // toValue converts the state to a protobuf value, see data below
                .putFields("kitchenDoor", UtilProtoBuf.toValue(state))
                .build()
            ).build()
        ).build()
    ).build());

toString для ReportStateAndNotificationRequest, чтобы вы могли видеть данные:

request_id: "16744804305948869781"
agent_user_id: "123"
payload {
  devices {
    states {
      fields {
        key: "kitchenDoor"
        value {
          struct_value {
            fields {
              key: "openPercent"
              value {
                number_value: 50.0
              }
            }
          }
        }
      }
    }
  }
}

person NateS    schedule 20.02.2021    source источник


Ответы (1)


Хотя вы можете получать входящие запросы, вы не можете сразу отправлять исходящие запросы обратно в Google. Сначала вы должны активировать HomeGraph API и загрузить ключ учетной записи службы < / а>.

Затем добавьте это в свой SmartHomeApp:

  // Get service account key from file
  FileInputStream stream = new FileInputStream("service-account-key.json");
  GoogleCredentials credentials = GoogleCredentials.fromStream(stream);
  mySmartHomeApp.setCredentials(credentials);

Это должно решить вашу проблему с авторизацией.

person Nick Felker    schedule 22.02.2021
comment
Спасибо. У меня там была учетная запись службы с client_email из [email protected]. Я переделал его, как указано в вашем ответе, и теперь это [email protected]. Все еще нужно протестировать, но я предполагаю, что это сработает. - person NateS; 23.02.2021