【发布时间】:2017-12-07 15:45:08
【问题描述】:
我正在尝试在 Kotlin 中为我的 Raspberry Pi 创建一个 Google 助理。我使用this IETF draft 中提出的所谓“设备流”实现了 OAuth 流,因为我的 Raspberry 稍后将只公开一个 Web 界面并且没有任何输入设备或图形界面。
Google 确实支持此流程(当然),我最终在用户同意的情况下获得了有效的访问令牌。出于测试目的,我还尝试了一个默认授权流程,它只会将用户转发到 localhost,因为它通常是这样做的,但它并没有解决问题。
我使用this tool 测试了访问令牌,它确认了范围和令牌的有效性。所以令牌本身应该可以工作。
范围是:https://www.googleapis.com/auth/assistant-sdk-prototype 记录在案的here 这实际上并不指向任何有效的网络资源,而是在每个文档中都有引用。
然后我尝试使用 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 选择(尽管我遵循了google 的建议)或 API 服务器的更改未正确记录在 google 的 getting started articles 中。
那么:有没有人遇到过同样的问题并知道如何解决?我在 github 上有这个项目。因此,如果有人需要损坏的源代码,我可以做一个临时提交来产生错误。
【问题讨论】:
-
似乎其他人目前也遇到了这个问题:plus.google.com/114306113999433581153/posts/Rfy4bJ7F8sy他们可能在最近的部署中破坏了一些东西:cloudplatform.googleblog.com/2017/12/…
标签: oauth kotlin grpc google-assistant-sdk