From 9212f7494018c687430b5249d3aee8bebc4918ce Mon Sep 17 00:00:00 2001 From: techschool <58562849+techschool@users.noreply.github.com> Date: Sun, 10 Apr 2022 15:27:06 +0200 Subject: [PATCH] extract user-agent and client-ip from grpc metadata (#34) Co-authored-by: phamlequang --- gapi/metadata.go | 43 ++++++++++++++++++++++++++++++++++++++++++ gapi/rpc_login_user.go | 5 +++-- 2 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 gapi/metadata.go diff --git a/gapi/metadata.go b/gapi/metadata.go new file mode 100644 index 00000000..3be03454 --- /dev/null +++ b/gapi/metadata.go @@ -0,0 +1,43 @@ +package gapi + +import ( + "context" + + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/peer" +) + +const ( + grpcGatewayUserAgentHeader = "grpcgateway-user-agent" + userAgentHeader = "user-agent" + xForwardedForHeader = "x-forwarded-for" +) + +type Metadata struct { + UserAgent string + ClientIP string +} + +func (server *Server) extractMetadata(ctx context.Context) *Metadata { + mtdt := &Metadata{} + + if md, ok := metadata.FromIncomingContext(ctx); ok { + if userAgents := md.Get(grpcGatewayUserAgentHeader); len(userAgents) > 0 { + mtdt.UserAgent = userAgents[0] + } + + if userAgents := md.Get(userAgentHeader); len(userAgents) > 0 { + mtdt.UserAgent = userAgents[0] + } + + if clientIPs := md.Get(xForwardedForHeader); len(clientIPs) > 0 { + mtdt.ClientIP = clientIPs[0] + } + } + + if p, ok := peer.FromContext(ctx); ok { + mtdt.ClientIP = p.Addr.String() + } + + return mtdt +} diff --git a/gapi/rpc_login_user.go b/gapi/rpc_login_user.go index 314162c5..774ea199 100644 --- a/gapi/rpc_login_user.go +++ b/gapi/rpc_login_user.go @@ -42,12 +42,13 @@ func (server *Server) LoginUser(ctx context.Context, req *pb.LoginUserRequest) ( return nil, status.Errorf(codes.Internal, "failed to create refresh token") } + mtdt := server.extractMetadata(ctx) session, err := server.store.CreateSession(ctx, db.CreateSessionParams{ ID: refreshPayload.ID, Username: user.Username, RefreshToken: refreshToken, - UserAgent: "", - ClientIp: "", + UserAgent: mtdt.UserAgent, + ClientIp: mtdt.ClientIP, IsBlocked: false, ExpiresAt: refreshPayload.ExpiredAt, })