如何在Golang gRPC中获取客户端IP地址和用户代理?

时间:2018-08-08 18:31:22

标签: go grpc grpc-go

我设置了一系列可以正常运行的gRPC请求和响应,但是当我尝试获取正在调用我的gRPC API的客户端IP地址和用户代理时,我陷入了困境。

我阅读了Go gRPC文档和其他资源,但没有找到很多有价值的信息。他们中很少有人谈论Golang中的gRPC。

设置gRPC API时,是否应该设置一个键值以在上下文中存储IP地址?

4 个答案:

答案 0 :(得分:0)

获取IP地址的方法已经在这里得到了很好的回答:Correct way of getting Client's IP Addresses from http.Request (Golang)

对于User-Agent标头,您只需要像下面这样解析User-Agent标头:userAgent := response.Header.Get("User-Agent")

答案 1 :(得分:0)

在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"

答案 2 :(得分:0)

在 Golang GRPC 中,context 有 3 个值

  1. 权威

  2. 内容类型

  3. 用户代理

    md,ok:=metadata.FromIncomingContext(ctx)
    fmt.Printf("%+v%+v",md,ok)
    

答案 3 :(得分:0)

对于grpc-gateway,可以通过x-forwarded-for

获取clientIp
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]
        }
    }
}