Как я могу получить IP-адрес клиента и агента пользователя в Golang gRPC?
Я настроил серию запросов и ответов gRPC, и все они работают нормально, но я застрял, когда пытаюсь получить IP-адрес клиента и агента пользователя, который вызывает мои API gRPC.
Я прочитал документацию Go gRPC и другие источники, но не нашел много ценной информации. Мало кто из них говорит о gRPC на Голанге.
Должен ли я установить значение ключа для хранения IP-адреса в контексте при настройке API gRPC?
4 ответа
В Golang GRPC вы можете использовать
func (UserServicesServer) Login(ctx context.Context, request *sso.LoginRequest) (*sso.LoginResponse, error) {
p, _ := peer.FromContext(ctx)
request.Frontendip = p.Addr.String()
.
.
}
Но не забывайте импорт "google.golang.org/grpc/peer"
Для КПГР-шлюз используется, то ClientIP может быть извлечено через
x-forwarded-for
if headers, ok := metadata.FromIncomingContext(ctx); ok {
xForwardFor := headers.Get("x-forwarded-for")
if len(xForwardFor) > 0 && xForwardFor[0] != "" {
ips := strings.Split(xForwardFor[0], ",")
if len(ips) > 0 {
clientIp = ips[0]
}
}
}
На способ получения IP-адреса уже был дан хороший ответ: правильный способ получения IP-адресов клиента из http.Request (Golang)
Что касается заголовка User-Agent, вам просто нужно проанализировать User-Agent
заголовок вроде такой: userAgent := response.Header.Get("User-Agent")
В Golang GRPC контекст имеет 3 значения
власть
Тип содержимого
пользовательский агент
md,ok:=metadata.FromIncomingContext(ctx) fmt.Printf("%+v%+v",md,ok)