package auth import ( "errors" "time" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" ) const ( DefTokenDuration = 7 * 24 * time.Hour // 7天 ) type IAuther interface { Login(id, secret string) (userID, loginType string, err error) Logout(loginInfo *LoginInfo) error } var ( authers map[string]IAuther ) var ( ErrUserNotExist = errors.New("用户不存在,请联系运营创建") ErrLoginTypeNotSupported = errors.New("不支持指定的登录类型") ErrUIDAndPassNotMatch = errors.New("用户与密码不匹配") ErrAPINeedRealLogin = errors.New("此API要求真正登录") ErrIllegalLoginType = errors.New("不支持的登录类型") ) type LoginInfo struct { ID string LoginType string ExpiresIn int64 Token string } func init() { authers = make(map[string]IAuther) } func RegisterAuther(loginType string, handler IAuther) { authers[loginType] = handler } func CreateLoginInfo(id, loginType string) (loginInfo *LoginInfo) { token := utils.GetUUID() loginInfo = &LoginInfo{ ID: id, LoginType: loginType, ExpiresIn: time.Now().Add(DefTokenDuration).Unix(), Token: token, } globals.SugarLogger.Debugf("CreateLoginInfo id:%s, loginType:%s, loginInfo:%s", id, loginType, utils.Format4Output(loginInfo, true)) api.Cacher.Set(token, loginInfo, DefTokenDuration) return loginInfo } func Login(id, loginType, secret string) (loginInfo *LoginInfo, err error) { globals.SugarLogger.Debugf("Login id:%s, loginType:%s, secret:%s", id, loginType, secret) if handler := authers[loginType]; handler != nil { userID, loginType2, err2 := handler.Login(id, secret) if err = err2; err == nil { if userID != "" { globals.SugarLogger.Debugf("Login id:%s, loginType:%s, id changed to:%s", id, loginType, userID) id = userID } if loginType2 != "" { loginType = loginType2 } return CreateLoginInfo(id, loginType), nil } err = ConvertErr2NoUser(err, "") } else { err = ErrLoginTypeNotSupported } return nil, err } func Logout(token string) (err error) { globals.SugarLogger.Debugf("Logout token:%s", token) loginInfo := new(LoginInfo) if err = api.Cacher.GetAs(token, loginInfo); err == nil { if handler := authers[loginInfo.LoginType]; handler != nil { err = handler.Logout(loginInfo) } api.Cacher.Del(token) } return err } func GetUserInfo(token string) (loginInfo *LoginInfo, err error) { loginInfo = new(LoginInfo) if err = api.Cacher.GetAs(token, loginInfo); err == nil { return loginInfo, nil } return nil, model.ErrTokenIsInvalid } func ConvertErr2NoUser(err error, mobileNum string) error { if dao.IsNoRowsError(err) { err = ErrUserNotExist } return err } func (a *LoginInfo) GetAuthID() string { return a.ID } func (a *LoginInfo) GetAuthType() string { return a.LoginType } func (a *LoginInfo) GetUserTag() string { return a.ID }