fix login #17
			
				
			
		
		
		
	| 
						 | 
				
			
			@ -54,3 +54,14 @@ func GetValueByKey(key string) ([]byte, error) {
 | 
			
		|||
	ctx := context.Background()
 | 
			
		||||
	return c.Get(ctx, key).Bytes()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetJSON(key string, result interface{}) bool {
 | 
			
		||||
	v, err := GetValueByKey(key)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	if err = json.Unmarshal(v, result); err != nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
package cache
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	keyPrefix = "usermngmt_"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	KeyLoginFailedTimes = keyPrefix + "login_failed_time"
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			@ -1,5 +1,12 @@
 | 
			
		|||
package config
 | 
			
		||||
 | 
			
		||||
import "time"
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	MaximumLoginFailedTime     = 5
 | 
			
		||||
	LoginFailedBlockedDuration = time.Hour
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Configuration struct {
 | 
			
		||||
	EmailIsUnique       bool
 | 
			
		||||
	PhoneNumberIsUnique bool
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,4 +29,6 @@ const (
 | 
			
		|||
	// Incorrect
 | 
			
		||||
 | 
			
		||||
	ErrorIncorrectPassword      = "mật khẩu không chính xác"
 | 
			
		||||
	ErrorInvalidLogin           = "thông tin đăng nhập không đúng"
 | 
			
		||||
	ErrorExceedMaximumLoginFail = "bạn đã đăng nhập sai thông tin quá số lần cho phép"
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -579,15 +579,21 @@ func ChangeAllUsersStatus(roleID, status string) error {
 | 
			
		|||
func LoginWithEmailAndPassword(email, password string) (result model.User, err error) {
 | 
			
		||||
	var (
 | 
			
		||||
		ctx            = context.Background()
 | 
			
		||||
		numOfLoginFail int
 | 
			
		||||
	)
 | 
			
		||||
	k := cache.KeyLoginFailedTimes + email
 | 
			
		||||
	// process block if reach maximum of login failed
 | 
			
		||||
	if ok := cache.GetJSON(k, &numOfLoginFail); ok && numOfLoginFail >= config.MaximumLoginFailedTime {
 | 
			
		||||
		return model.User{}, errors.New(internal.ErrorExceedMaximumLoginFail)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Validate email, password
 | 
			
		||||
	if email == "" {
 | 
			
		||||
		err = errors.New(internal.ErrorInvalidEmail)
 | 
			
		||||
		err = errors.New(internal.ErrorInvalidLogin)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if password == "" {
 | 
			
		||||
		err = errors.New(internal.ErrorInvalidPassword)
 | 
			
		||||
		err = errors.New(internal.ErrorInvalidLogin)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -597,13 +603,14 @@ func LoginWithEmailAndPassword(email, password string) (result model.User, err e
 | 
			
		|||
		"deleted": false,
 | 
			
		||||
	})
 | 
			
		||||
	if user.ID.IsZero() {
 | 
			
		||||
		err = errors.New(internal.ErrorNotFoundUser)
 | 
			
		||||
		err = errors.New(internal.ErrorInvalidLogin)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Check Password
 | 
			
		||||
	if !internal.CheckPasswordHash(password, user.HashedPassword) {
 | 
			
		||||
		err = errors.New(internal.ErrorIncorrectPassword)
 | 
			
		||||
		err = errors.New(internal.ErrorInvalidLogin)
 | 
			
		||||
		cache.SetKeyValue(k, numOfLoginFail+1, config.LoginFailedBlockedDuration)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue