在http请求中设置grpc元数据

时间:2018-11-02 20:54:09

标签: rest grpc grpc-gateway

我正在尝试使用grpc-gateway为现有gRPC服务创建REST端点。 gRPC服务利用在grpc调用中传递的“元数据”进行身份验证。 如何在REST调用中设置元数据?

我尝试在标头中传递元数据键值对。但是它没有在上下文中设置元数据。

1 个答案:

答案 0 :(得分:2)

这里的技巧是使用自定义的传入标头匹配器。您可以在源代码或grpc-gatway中看到,有一个WithIncomingHeaderMatcher可以将传入的HTTP标头转换为传递到上下文的元数据(稍后由gRPC服务器处理程序使用)。默认情况下,它支持按原样传递的一组所谓的permanent HTTP headers(例如,Authorization标头在上下文中将显示为Authorization),或者您需要添加前缀您的带有特定前缀Grpc-Metadata-的自定义标头,请参见its usage here。在这种情况下,Grpc-Metadata-Your-Name HTTP标头将作为元数据中的Your-Name字段出现。

同样,如果这对您和您来说太麻烦了,您都无法通过。 X-User-Id或任何自定义格式的标头到您的应用中,您需要设置一个自定义标头匹配器。我建议您显式处理标头,然后回退到默认标头(如果您随后更新依赖项并添加一些新的permanentHTTPHeader,效果很好,

    func headerMatcher(header string) (string, bool) {
        if header == "X-User-Id" {
            return "x-user-id", true
        }
        return runtime.DefaultHeaderMatcher(header)
    }

希望这会有所帮助!