package utils import ( "context" "net/url" "strconv" "google.golang.org/grpc/metadata" ) type UserInfo struct { ID int64 Name string RawUID string Refresh 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") if len(refreshList) == 0 { refreshList = md.Get("X-Refresh") } rawUID := "" encodeName := "" refresh := "" if len(uidList) > 0 { rawUID = uidList[0] } if len(nameList) > 0 { encodeName = nameList[0] } if len(refreshList) > 0 { refresh = refreshList[0] } if rawUID == "" { return UserInfo{Valid: false, Refresh: refresh} } uid, err := strconv.ParseInt(rawUID, 10, 64) if err != nil { return UserInfo{ RawUID: rawUID, Name: encodeName, Refresh: refresh, Valid: false, } } userName, _ := url.QueryUnescape(encodeName) return UserInfo{ ID: uid, Name: userName, RawUID: rawUID, Refresh: refresh, Valid: true, } }