Files
lone-services/pkg/utils/loginInfo.go
T
gjs be8f89f449
CI / changes (push) Successful in 5s
CI / docker-bff (push) Failing after 7s
CI / docker-product (push) Failing after 5s
CI / docker-admin (push) Failing after 4s
CI / docker-user (push) Failing after 6s
change layout
2026-08-20 15:41:44 +08:00

74 lines
1.5 KiB
Go

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]
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
}