如何对 Assistant SDK 的 gRPC 调用进行身份验证?

van*_*shg 5 macos ssl swift grpc google-assistant-sdk

我正在使用 Swift gRPC 库(奇怪的是没有在 gRPC 的网站上列出,但有一个GitHub 存储库)来构建适用于 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)")
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是 Wireshark 的样子,如果有帮助的话: 在此处输入图片说明

van*_*shg 3

我必须将此处roots.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])
Run Code Online (Sandbox Code Playgroud)