1

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

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

4

1 回答 1

6

这里的诀窍是使用自定义传入标头匹配器。您可以在源代码或 grpc-gatway 中看到,有一个WithIncomingHeaderMatcher将传入的 HTTP 标头转换为传递到上下文的元数据(稍后由 gRPC 服务器处理程序使用)。默认情况下,它支持一组所谓的永久 HTTP 标头,这些标头按原样传递(例如,Authorization标头将Authorization在上下文中出现),或者您需要为自定义标头添加特定前缀Grpc-Metadata-,在这里查看它的用法。在这种情况下,Grpc-Metadata-Your-NameHTTP 标头将作为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)
    }

希望这可以帮助!

于 2019-02-04T19:10:16.153 回答