package auth import ( "errors" "time" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/globals" ) const ( DefTokenDuration = 7 * 24 * time.Hour // 7天 ) type IAuther interface { Login(id, secret string) error Logout(id string) error } var ( authers map[string]IAuther ) var ( ErrLoginTypeNotSupported = 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 { if err = handler.Login(id, secret); err == nil { token := utils.GetUUID() loginInfo = &LoginInfo{ ID: id, LoginType: loginType, ExpiresIn: time.Now().Add(DefTokenDuration).Unix(), Token: token, } globals.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 = globals.Cacher.GetAs(token, loginInfo); err == nil { if handler := authers[loginInfo.LoginType]; handler != nil { err = handler.Logout(loginInfo.ID) } globals.Cacher.Del(token) } return err } func GetUserInfo(token string) (loginInfo *LoginInfo, err error) { loginInfo = new(LoginInfo) if err = globals.Cacher.GetAs(token, loginInfo); err == nil { return loginInfo, nil } return nil, err }