c33fbdb422
CI / changes (push) Successful in 4s
CI / docker-bff (push) Successful in 3m21s
CI / docker-product (push) Successful in 3m39s
CI / docker-admin (push) Successful in 3m34s
CI / docker-user (push) Successful in 3m29s
CI / docker-ad (push) Successful in 3m29s
75 lines
1.6 KiB
Go
75 lines
1.6 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]
|
|
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
|
|
}
|