func EmailLogin(c context.Context, email string, password string) (*LoginResult, error) { a, err := persistence.GetAccountByEmail(email) if err != nil { log.Error(email, password) return nil, ErrServer } if a == nil { log.Error(email, password) return nil, ErrLogin } password = crypt.SHA1(password + fmt.Sprint(a.ID)) if password != a.Password { return nil, ErrLogin } rs := &LoginResult{} rs.Account = &Account{} runtime.CopyFields(rs.Account, a) rs.LoginToken = a.LoginToken rs.Sid = GenerateSessionID(a.ID) return rs, nil }
func MobileRegister(c context.Context, regInfo *MobileRegInfo) (*LoginResult, error) { var e error switch { case !validation.IsMobile(regInfo.Mobile): e = errors.New("invalid mobile") case !checkCaptcha(c, regInfo.Mobile, regInfo.Captcha): e = errors.New("invalid captcha") case persistence.IsDupMobile(regInfo.Mobile, 0): e = ErrDupMobile case len(regInfo.Nick) < 2: e = errors.New("invalid nick") case persistence.IsDupNick(regInfo.Nick, 0): e = ErrDupNick case len(regInfo.Birthdate) > 0 && !validation.IsBirthdate(regInfo.Birthdate): e = errors.New("invalid birthdate") case len(regInfo.Password) == 0: e = errors.New("no password") } if e != nil { log.Error(e) return nil, e } a := &persistence.Account{} a.ID = types.NewID() a.Nick = regInfo.Nick a.Mobile = regInfo.Mobile a.Password = crypt.SHA1(regInfo.Password + fmt.Sprint(a.ID)) a.Birthdate = regInfo.Birthdate a.Gender = regInfo.Gender a.Avatar = regInfo.Avatar a.LoginToken = crypt.SHA1(a.Password + fmt.Sprint(a.ID)) e = persistence.InsertAccount(a) if e != nil { log.Error(e) return nil, ErrServer } rs := &LoginResult{} rs.Account = &Account{} runtime.CopyFields(rs.Account, a) rs.LoginToken = a.LoginToken rs.Sid = GenerateSessionID(a.ID) return rs, nil }
func OpenLogin(c context.Context, oa *OpenAccount) (*LoginResult, error) { switch { case len(oa.Name) == 0: return nil, errors.New("invalid name") case len(oa.OpenID) == 0: return nil, errors.New("no open_id") case len(oa.AccessToken) == 0: return nil, errors.New("no access_token") case len(oa.RefreshToken) == 0: return nil, errors.New("no refresh_token") case oa.ExpiredAt < time.Now().Unix(): return nil, errors.New("invalid expired_at") } openID := fmt.Sprint(oa.Type) + "--" + oa.OpenID a, err := persistence.GetAccountByOpenID(openID) if err != nil { return nil, ErrServer } if a != nil { rs := &LoginResult{} rs.Account = &Account{} runtime.CopyFields(rs.Account, a) rs.LoginToken = a.LoginToken rs.Sid = GenerateSessionID(a.ID) return rs, nil } nick := oa.Name for i := 1; persistence.IsDupNick(nick, 0); i++ { nick = oa.Name + fmt.Sprint(i) } a = &persistence.Account{} a.ID = types.NewID() a.Nick = nick a.Avatar = oa.Avatar a.Gender = oa.Gender a.OpenID = openID a.Password = crypt.SHA1(oa.AccessToken + fmt.Sprint(a.ID)) a.LoginToken = GenerateLoginToken(a.ID) err = persistence.InsertAccount(a) if err != nil { return nil, ErrServer } poa := &persistence.OpenAccount{} runtime.CopyFields(poa, oa) persistence.InsertOpenAccount(poa) rs := &LoginResult{} rs.Account = &Account{} runtime.CopyFields(rs.Account, a) rs.LoginToken = a.LoginToken rs.Sid = GenerateSessionID(a.ID) return rs, nil }
func GenerateLoginToken(id types.ID) string { return crypt.SHA1(fmt.Sprint(id) + fmt.Sprint(time.Now().Unix())) }
func GenerateSessionID(accountID types.ID) string { sid := crypt.SHA1(fmt.Sprint(accountID) + fmt.Sprint(time.Now().Unix()) + types.NewUUID()) _cache.HSet("sid", sid, accountID, time.Minute*30) return sid }