Files
jx-callback/business/jxutils/jxcontext/jxcontext.go

171 lines
4.0 KiB
Go

package jxcontext
import (
"errors"
"net/http"
"git.rosy.net.cn/jx-callback/business/auth2"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals"
)
type IAuther interface {
GetAuthID() string
GetAuthType() string
GetUserTag() string
}
type Context struct {
*auth2.Context
token string
userInfo IAuther //*auth.LoginInfo
}
const (
MaxUserNameLen = 30
)
var (
AdminCtx *Context
)
func init() {
AdminCtx = NewWithUserName(nil, model.AdminName, nil, nil)
}
func NewWithOnlyUserName(userName string) (ctx *Context) {
return NewWithUserName(nil, userName, nil, nil)
}
func NewWithUserName(notUsed interface{}, userName string, w http.ResponseWriter, r *http.Request) (ctx *Context) {
ctx = &Context{
token: userName,
Context: auth2.NewContext(w, r),
}
return ctx
}
func New(notUsed interface{}, token string, w http.ResponseWriter, r *http.Request) (ctx *Context, errCode string, err error) {
ctx = &Context{
token: token,
Context: auth2.NewContext(w, r),
}
globals.SugarLogger.Debugf("jxcontext New, token:%s", token)
if auth2.IsV2Token(token) {
authInfo, err2 := auth2.GetTokenInfo(token)
if err = err2; err == nil {
ctx.userInfo = authInfo
// globals.SugarLogger.Debugf("jxcontext New, V2 authInfo:%s", utils.Format4Output(authInfo, true))
if authInfo.TokenType != auth2.TokenTypeNormal {
err = errors.New("需要正式TOKEN")
}
}
} else {
globals.SugarLogger.Infof("jxcontext wrong token:%s", token)
errCode = model.ErrCodeTokenIsInvalid
// userInfo, err2 := auth.GetUserInfo(token)
// if err = err2; err == nil {
// // globals.SugarLogger.Debugf("jxcontext New, V1 authInfo:%s", utils.Format4Output(userInfo, true))
// ctx.userInfo = userInfo
// }
}
if err == model.ErrTokenIsInvalid {
if !globals.IsProductEnv() {
err = nil
} else {
errCode = model.ErrCodeTokenIsInvalid
}
}
if err == model.ErrTokenIsInvalid {
globals.SugarLogger.Debugf("token is invalid, token:%s", token)
}
return ctx, errCode, err
}
func (ctx *Context) GetUserName() string {
userName := ctx.token
if ctx.userInfo != nil {
userName = ctx.userInfo.GetUserTag()
} else if userName == "" {
userName = ctx.GetRealRemoteIP()
}
if len(userName) > MaxUserNameLen {
userName = userName[:MaxUserNameLen]
}
return userName
}
func (ctx *Context) GetLoginID() string {
if ctx.userInfo != nil {
return ctx.userInfo.GetAuthID()
}
return ""
}
func (ctx *Context) GetLoginType() string {
if ctx.userInfo != nil {
return ctx.userInfo.GetAuthType()
}
return ""
}
func (ctx *Context) GetToken() string {
return ctx.token
}
func (ctx *Context) GetLoginInfo() IAuther {
return ctx.userInfo
}
func (ctx *Context) GetV2AuthInfo() (authInfo *auth2.AuthInfo, err error) {
authInfo, ok := ctx.userInfo.(*auth2.AuthInfo)
// globals.SugarLogger.Debugf("GetV2AuthInfo, userInfo:%s", utils.Format4Output(ctx.userInfo, false))
if ok {
return authInfo, nil
}
return nil, auth2.ErrNeedV2Token
}
func (ctx *Context) GetTrackInfo() string {
return ctx.Context.GetTrackInfo() + "," + ctx.GetUserName()
}
func (ctx *Context) GetMobileAndUserID() (mobile, userID string) {
token := ctx.GetToken()
if auth2.IsV2Token(token) {
authInfo, err2 := auth2.GetTokenInfo(token)
if err2 == nil {
if authInfo.TokenType == auth2.TokenTypeNormal {
mobile = authInfo.GetMobile()
userID = authInfo.GetID()
}
}
} else {
}
return mobile, userID
}
func (ctx *Context) GetUserID() (userID string) {
token := ctx.GetToken()
authInfo, err2 := auth2.GetTokenInfo(token)
if err2 == nil {
if authInfo.TokenType == auth2.TokenTypeNormal {
userID = authInfo.GetID()
}
}
return userID
}
func (ctx *Context) GetFullUser() (user *model.User) {
token := ctx.GetToken()
authInfo, err2 := auth2.GetTokenInfo(token)
if err2 == nil {
if authInfo.TokenType == auth2.TokenTypeNormal {
user, _ = dao.GetUserByID(dao.GetDB(), "user_id", authInfo.GetID())
}
}
return user
}