package utils import ( "context" "net/url" "strconv" "github.com/mssola/user_agent" "google.golang.org/grpc/metadata" ) type UserInfo struct { ID int64 Name string RawUID string Refresh string ClientIP string // 客户端ip UserAgent string // 完整原始ua BrowserName string // 浏览器名称 BrowserVer string // 浏览器版本 Valid bool } func GetUserFromCtx(ctx context.Context) UserInfo { md, ok := metadata.FromIncomingContext(ctx) if !ok { return UserInfo{Valid: false} } uidList := md.Get("x-user-id") nameList := md.Get("x-user-name") refreshList := md.Get("x-refresh") ipList := md.Get("x-client-ip") userAgentList := md.Get("x-user-agent") if len(refreshList) == NumberZero { refreshList = md.Get("X-Refresh") } var userInfo UserInfo if len(uidList) > 0 { userInfo.RawUID = uidList[0] } if len(nameList) > 0 { userInfo.Name = nameList[0] } if len(refreshList) > 0 { userInfo.Refresh = refreshList[0] } if len(ipList) > 0 { userInfo.ClientIP = ipList[0] } if len(userAgentList) > 0 { userInfo.UserAgent = userAgentList[0] userInfo.UserAgent, _ = url.QueryUnescape(userInfo.UserAgent) ua := user_agent.New(userInfo.UserAgent) userInfo.BrowserName, userInfo.BrowserVer = ua.Browser() } userInfo.Valid = false if userInfo.RawUID == StringEmpty { return userInfo } uid, err := strconv.ParseInt(userInfo.RawUID, NumberTen, NumberSixtyFourth) if err != nil { return userInfo } userName, _ := url.QueryUnescape(userInfo.Name) userInfo.ID = uid userInfo.Name = userName userInfo.Valid = true return userInfo }