Установка метаданных grpc в запросе http - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь создать конечные точки REST для существующего сервиса gRPC, используя grpc-gateway. Служба gRPC использует «метаданные», передаваемые в вызовах grpc для аутентификации. Как установить метаданные в моих вызовах REST?

Я попытался передать пары значений метаданных в заголовки. Но он не устанавливает метаданные в контексте.

1 Ответ

0 голосов
/ 04 февраля 2019

Хитрость здесь в том, чтобы использовать пользовательский сопоставитель входящего заголовка . В исходном коде или в grpc-gatway вы можете видеть, что существует WithIncomingHeaderMatcher , который преобразует входящие HTTP-заголовки в метаданные, передаваемые в контекст (позже используемый обработчиками сервера gRPC). По умолчанию он поддерживает набор так называемых постоянных HTTP-заголовков , которые передаются как есть (например, заголовок Authorization будет отображаться как Authorization в контексте), или вам нужно добавить префикс Ваши пользовательские заголовки с определенным префиксом, Grpc-Metadata- , см. его использование здесь . В этом случае HTTP-заголовок Grpc-Metadata-Your-Name будет отображаться как поле 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)
    }

Надеюсь, это поможет!

...