Установка метаданных grpc в запросе http

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

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

0 ответов

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

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

Другие вопросы по тегам