heritage-api/service/auth-service.go

116 lines
2.9 KiB
Go

package service
import (
"errors"
"strings"
"github.com/sirupsen/logrus"
"myschools.me/heritage/heritage-api/model"
"myschools.me/heritage/heritage-api/mysql"
"myschools.me/heritage/heritage-api/redis"
)
var (
ErrInvalidCredentials = errors.New("invalid credentials")
ErrInvalidArgument = errors.New("invalid argument")
ErrOldPasswordWrong = errors.New("old password wrong")
ErrNewPasswordShort = errors.New("new password too short")
ErrUserNotFound = errors.New("user not found")
)
func Login(userName, plainPassword string) (string, *model.User, error) {
userName = strings.TrimSpace(userName)
if userName == "" || plainPassword == "" {
return "", nil, ErrInvalidCredentials
}
u, found, err := mysql.UserByUserName(&userName)
if err != nil {
logrus.WithFields(logrus.Fields{
"func": "service.Login",
"userName": userName,
}).Errorf("mysql.UserByUserName: %s", err.Error())
return "", nil, err
}
if !found || u == nil || u.PasswordHash == "" {
return "", nil, ErrInvalidCredentials
}
if !VerifyPassword(u.PasswordHash, plainPassword) {
return "", nil, ErrInvalidCredentials
}
token := newToken()
safeUser := &model.User{
ID: u.ID,
UserName: u.UserName,
RoleID: u.RoleID,
}
if err := redis.UserTokenSet(&token, safeUser); err != nil {
logrus.WithFields(logrus.Fields{
"func": "service.Login",
"userID": u.ID,
}).Errorf("redis.UserTokenSet: %s", err.Error())
return "", nil, err
}
return token, safeUser, nil
}
func Logout(token string) error {
token = strings.TrimSpace(token)
token = strings.TrimPrefix(token, "Bearer ")
token = strings.TrimPrefix(token, "bearer ")
if token == "" {
return nil
}
return redis.UserTokenDel(&token)
}
func ChangePassword(userID, oldPassword, newPassword string) error {
oldPassword = strings.TrimSpace(oldPassword)
newPassword = strings.TrimSpace(newPassword)
if oldPassword == "" || newPassword == "" {
return ErrInvalidArgument
}
if len(newPassword) < 6 {
return ErrNewPasswordShort
}
dbUser, found, err := mysql.UserByID(&userID)
if err != nil {
logrus.WithFields(logrus.Fields{
"func": "service.ChangePassword",
"userID": userID,
}).Errorf("mysql.UserByID: %s", err.Error())
return err
}
if !found || dbUser == nil || dbUser.PasswordHash == "" {
return ErrUserNotFound
}
if !VerifyPassword(dbUser.PasswordHash, oldPassword) {
return ErrOldPasswordWrong
}
hash, err := HashPassword(newPassword)
if err != nil {
logrus.WithFields(logrus.Fields{
"func": "service.ChangePassword",
"userID": userID,
}).Errorf("password.HashPassword: %s", err.Error())
return err
}
updated, err := mysql.UpdateUserPasswordHash(&userID, &hash)
if err != nil {
logrus.WithFields(logrus.Fields{
"func": "service.ChangePassword",
"userID": userID,
}).Errorf("mysql.UpdateUserPasswordHash: %s", err.Error())
return err
}
if !updated {
return ErrUserNotFound
}
return nil
}