如何验证助理SDK的gRPC调用?

时间:2017-05-05 06:25:26

标签: swift macos ssl grpc google-assistant-sdk

我正在使用Swift gRPC库(好奇地没有在gRPC的网站上列出,但有一个GitHub repo来构建)用于macOS的Google Assistant SDK的实现。我已经获得了我的OAuth2凭据和令牌,并且我正在尝试发出初始请求以开始对话,但是它没有这样做。

我总是收到错误Google_Assistant_Embedded_V1Alpha1_EmbeddedAssistantClientError error 1.)gRPC.CallError error 1.

我运行Wireshark尝试调试问题,我看到我的计算机 尝试建立连接但最终最终中止连接。我认为这可能是由于TLS问题,但我不确定是否真的是这种情况或如何解决它。

我注意到服务初始化函数有一个重载你指定证书,但我不知道放在那里(或者根本需要使用该函数)

typealias AssistantService = Google_Assistant_Embedded_V1Alpha1_EmbeddedAssistantService
typealias AssistantCall = Google_Assistant_Embedded_V1Alpha1_EmbeddedAssistantConverseCall
typealias AudioInConfig = Google_Assistant_Embedded_V1alpha1_AudioInConfig
typealias AudioOutConfig = Google_Assistant_Embedded_V1alpha1_AudioOutConfig
typealias ConverseRequest = Google_Assistant_Embedded_V1alpha1_ConverseRequest
typealias ConverseConfig = Google_Assistant_Embedded_V1alpha1_ConverseConfig    

var service: AssistantService?
var currentCall: AssistantCall?

public init() {
    service = AssistantService(address: Constants.ASSISTANT_API_ENDPOINT)
    let token = "Bearer \(UserDefaults.standard.string(forKey: Constants.AUTH_TOKEN_KEY)!)"
    service?.metadata = Metadata(["authorization" : token])
}

func initiateRequest() {
    var request =   ConverseRequest()
    request.config = ConverseConfig()

    var audioInConfig = AudioInConfig()
    audioInConfig.sampleRateHertz = 16000
    audioInConfig.encoding = .linear16
    request.config.audioInConfig = audioInConfig


    var audioOutConfig = AudioOutConfig()
    audioOutConfig.sampleRateHertz = 16000
    audioOutConfig.encoding = .linear16
    audioOutConfig.volumePercentage = 50
    request.config.audioOutConfig = audioOutConfig

    do {
        currentCall = try service?.converse(completion: { result in
            print("Result code \(result.statusCode)")
            print("Result description \(result.description)")
            print("Metadata \(String(describing: result.initialMetadata))")
            print("Status message \(result.statusMessage ?? "Error")")
            print("Obj description \(String(describing: result))")
            print("result \(result)")
        })

        try currentCall?.send(request) { err in
            print("Error in initial request: \(err)")
        }
    } catch {
        print("Initial error \(error)")
    }
}

这就是Wireshark的样子,如果有任何帮助的话: enter image description here

4 个答案:

答案 0 :(得分:2)

我必须将找到hereroots.pem文件添加到我的项目中,并按如下方式使用它:

let u = Bundle.main.url(forResource: "roots", withExtension: "pem")!
let certificate = try! String(contentsOf: u)
let token = "Bearer \(UserDefaults.standard.string(forKey: Constants.AUTH_TOKEN_KEY)!)"
service = AssistantService(address: Constants.ASSISTANT_API_ENDPOINT, certificates: certificate, host: nil)
service?.metadata = Metadata(["authorization" : token])

答案 1 :(得分:0)

我不知道Swift,你的Wireshark屏幕截图可能掩盖了重要信息,但我相信以下一个或两个可能是问题:

  1. Constants.ASSISTANT_API_ENDPOINT需要设置为“embeddedassistant.googleapis.com”。 (目前尚不清楚,但我不认为Wireshark中显示的目标地址是API端点,它应该是。)

  2. Constants.AUTH_TOKEN_KEY应该是您作为OAuth2舞蹈的一部分获得的身份验证令牌。请记住,它会过期(通常在一小时后),您需要获得一个新的。我不知道Swift配置是如何工作的,但在其他情况下,您不需要指定auth信息的“Bearer”部分,因为您没有专门传递标题。

答案 2 :(得分:0)

请参阅调用Google Cloud API的grpc-swift项目中的一些new examples。我已经简化了客户端创建以默认使用TLS并在库二进制文件中嵌入了默认的roots.pem。您可以看到here以及支持Google Application Default Credentials的auth library的使用情况。

答案 3 :(得分:0)

获取最新信息
pod'SwiftGRPC' pod'SwiftProtobuf' 使用pod更新的版本,它已修复。

安装BoringSSL 10.0.6(原为10.0.5,源从https://github.com/CocoaPods/Specs.git更改为https://github.com/cocoapods/specs.git) 安装SwiftGRPC 0.5.1(原为0.4.3,源从https://github.com/CocoaPods/Specs.git更改为https://github.com/cocoapods/specs.git) 安装gRPC-Core 1.12.0(从1.11.0开始,源从https://github.com/CocoaPods/Specs.git更改为https://github.com/cocoapods/specs.git) 安装Realm 3.7.6(原为3.7.4,源从https://github.com/CocoaPods/Specs.git更改为https://github.com/cocoapods/specs.git) 安装RealmSwift 3.7.6(原为3.7.4,源从https://github.com/CocoaPods/Specs.git更改为https://github.com/cocoapods/specs.git

然后我所需要的就是用我的证书创建会话/服务。

让certPath = Bundle.main.url(forResource:“ XYZ”,withExtension:“ pem”)! 让证书=尝试!字符串(contentsOf:certPath) 服务=发音者_PronounceServiceClient(地址:Constants.ServerApi.grpcBaseUrl,证书:证书)