2017-12-07 7 views
1

Ich versuche, einen Google Assistant für meinen Raspberry Pi in Kotlin zu erstellen. Ich implementierte einen OAuth-Fluss unter Verwendung des sogenannten "Device Flow", der in this IETF draft vorgeschlagen wurde, da mein Raspberry später nur ein Web-Interface verfügbar machen soll und keine Eingabegeräte oder grafischen Schnittstellen hat.Google Assistant SDK, das authentifizierten Kanal als "nicht vertrauenswürdig" abweist

Google unterstützt diesen Fluss (natürlich) und ich erhalte am Ende ein gültiges Zugriffs-Token mit Benutzerzustimmung. Zu Testzwecken habe ich auch einen Standard-Autorisierungsfluss versucht, der den Benutzer nur an localhost weiterleitet, wie es normalerweise gemacht wird, aber das Problem wurde dadurch nicht gelöst.

Ich testete das Access-Token mit this tool und es bestätigt die Gültigkeit des Bereichs und Token. Also sollte das Token selbst funktionieren.

Scope ist: https://www.googleapis.com/auth/assistant-sdk-prototype wie dokumentiert here Dies zeigt tatsächlich nicht auf eine gültige Web-Ressource, sondern ist in jeder Dokumentation verwiesen.

Dann habe ich versucht, Audiodaten mit Hilfe der gRPC bereitgestellten Java-Stubs zum Assistant SDK-Endpunkt zu streamen. Wie eine dritte Partei nahm reference implementation als eine Anleitung, wie der RPC-Stub zu authentifizieren. Aber weder die Referenzimplementierung noch meine eigene funktioniert. Beide berichten

io.grpc.StatusRuntimeException: UNAUTHENTICATED: Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project. 

Der Stub authentifiziert wird auf diese Weise:

embeddedAssistantStub.withCallCredentials(
      MoreCallCredentials.from(OAuth2Credentials 
        .newBuilder() 
        .setAccessToken(
          myAccessToken, 
          myAccessTokenExpirationDate)) 
        .build())) 

und die authentifizierte Anforderung wird wie folgt durchgeführt:

val observer = authenticatedEmbeddedAssistantStub.converse(myStreamObserverImplementation) 
observer.onNext(myConfigConverseRequest) 
while(more audio data frames available) { 
    observer.onNext(myAudioFrameConverseRequest) 
} 
observer.onCompleted() 

(I Präfix Pseudovariablen mit "my" für Klarheit, können sie aus mehr Code in der tatsächlichen Umsetzung bestehen.)

Ich habe sogar th kontaktiert Der Autor dieser Demo-Implementierung. Er sagte mir, als er das letzte Mal (vor einigen Monaten) nachprüfte, funktionierte es einwandfrei. So hatte ich keine Optionen mehr. Da die Client-Implementierung, die ich als Referenz verwendet verwendet, um zu arbeiten, und ich tatsächlich den Stub authentifizieren (obwohl die Fehlermeldung das Gegenteil suggeriert) Wahrscheinlich ist entweder meine gültige Zugriffstoken mit dem richtigen Bereich nicht geeignet für die Assistent API gewählt (obwohl ich folgte Die Vorschläge von Google) oder die API-Server hatten eine Änderung nicht ordnungsgemäß in der getting started articles von Google dokumentiert.

Also: Ist jemand in das gleiche Problem gelaufen und weiß, wie man es repariert? Ich habe das Projekt auf GitHub. Wenn also jemand den defekten Quellcode benötigt, kann ich einen temporären Commit machen, der den Fehler erzeugt.

Hinweis, um einige Arbeiten für Mods zu speichern: Dieses Problem bezieht sich auf this und this Frage, sowohl nicht gelöst und mit verschiedenen Sprachen, sondern beschreibt ein ähnliches Problem.

+0

Es scheint, andere sind zur Zeit auch Probleme mit diesem zu erleben: https://plus.google.com/114306113999433581153/posts/Rfy4bJ7F8sy Sie können in ihrer jüngsten deploy gebrochen etwas haben: https: // cloudplatform. googleblog.com/2017/12/OAuth-whitelisting-can-now-control-access-to-GCP-services-and-data.html –

Antwort

Verwandte Themen