package auth import ( "errors" "fmt" "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/api" ) const ( DefTokenDuration = 7 * 24 * time.Hour // 7天 ) type IAuther interface { Login(id, secret string) (userID string, err error) Logout(loginInfo *LoginInfo) error } var ( authers map[string]IAuther ) var ( ErrLoginTypeNotSupported = errors.New("不支持指定的登录类型") ErrUIDAndPassNotMatch = 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 Login(id, loginType, secret string) (loginInfo *LoginInfo, err error) { if handler := authers[loginType]; handler != nil { userID, err2 := handler.Login(id, secret) if err = err2; err == nil { if userID != "" { id = userID } token := utils.GetUUID() loginInfo = &LoginInfo{ ID: id, LoginType: loginType, ExpiresIn: time.Now().Add(DefTokenDuration).Unix(), Token: token, } api.Cacher.Set(token, loginInfo, DefTokenDuration) return loginInfo, nil } } else { err = ErrLoginTypeNotSupported } return nil, err } func Logout(token string) (err error) { 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 = fmt.Errorf("没有%s这个用户", mobileNum) } return err }