我正在尝试在Kotlin为我的Raspberry Pi创建一个Google智能助理。我使用this IETF draft中提出的所谓“设备流”实现了OAuth流,因为我的Raspberry稍后只会暴露一个Web界面,并且没有任何输入设备或图形界面。
Google确实支持此流程(当然),我最终获得了用户同意的有效访问令牌。出于测试目的,我还尝试了一个默认授权流程,它只是将用户转发到localhost,因为它通常已经完成,但它没有解决问题。
我使用this tool测试了访问令牌,并确认了范围和令牌的有效性。所以令牌本身应该有效。
范围是:https://www.googleapis.com/auth/assistant-sdk-prototype,如文档所述here 这实际上并不指向任何有效的Web资源,但在每个文档中都会引用它。
然后我尝试使用gRPC提供的java存根将音频数据流式传输到助手SDK端点。以第三方reference implementation为指导如何验证rpc存根。但参考实现和我自己的实现都不起作用。他们都报告
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.
存根以这种方式进行身份验证:
embeddedAssistantStub.withCallCredentials(
MoreCallCredentials.from(OAuth2Credentials
.newBuilder()
.setAccessToken(
myAccessToken,
myAccessTokenExpirationDate))
.build()))
并且经过身份验证的请求执行如下:
val observer = authenticatedEmbeddedAssistantStub.converse(myStreamObserverImplementation)
observer.onNext(myConfigConverseRequest)
while(more audio data frames available) {
observer.onNext(myAudioFrameConverseRequest)
}
observer.onCompleted()
(为了清楚起见,我将伪变量加上“my”,它们可以在实际实现中包含更多代码。)
我甚至联系过这个演示实现的作者。他告诉我,他上次检查(几个月前)它的工作完全正常。所以我终于没有选择了。 由于客户端实现我作为参考用于工作,我实际上验证了存根(尽管错误消息暗示相反)可能,我的有效访问令牌具有正确的范围不适合辅助API(尽管我遵循了谷歌的建议或API服务器的更改未在谷歌getting started articles中正确记录。
所以:有没有人遇到同样的问题,知道如何修复它?我在github上有这个项目。因此,如果任何人需要破解的源代码,我可以进行产生错误的临时提交。
答案 0 :(得分:0)
嗯,我的第二个假设似乎是正确的:错误是服务器端。这是github问题,让我们等待修复。
https://github.com/googlesamples/assistant-sdk-python/issues/138