76 lines
2.0 KiB
Go
76 lines
2.0 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 AuthLogin(userName, plainPassword string) (string, *model.User, error) {
|
|
userName = strings.TrimSpace(userName)
|
|
if userName == "" || plainPassword == "" {
|
|
return "", nil, ErrInvalidCredentials
|
|
}
|
|
|
|
u, err := mysql.UserByUserName(&userName)
|
|
if err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "AuthLogin",
|
|
"userName": userName,
|
|
}).Errorf("mysql.UserByUserName: %s", err.Error())
|
|
return "", nil, err
|
|
}
|
|
if u == nil || u.PasswordHash == "" {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "AuthLogin",
|
|
"userName": userName,
|
|
}).Warnf("user not found or password not set")
|
|
return "", nil, ErrInvalidCredentials
|
|
}
|
|
if !PasswordVerify(u.PasswordHash, plainPassword) {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "AuthLogin",
|
|
"userName": userName,
|
|
}).Warnf("password verification failed")
|
|
return "", nil, ErrInvalidCredentials
|
|
}
|
|
|
|
token := newToken()
|
|
safeUser := &model.User{
|
|
ID: u.ID,
|
|
UserName: u.UserName,
|
|
RoleID: u.RoleID,
|
|
OrgID: u.OrgID,
|
|
}
|
|
if err := redis.UserTokenSet(&token, safeUser); err != nil {
|
|
logrus.WithFields(logrus.Fields{
|
|
"func": "AuthLogin",
|
|
"userID": u.ID,
|
|
}).Errorf("redis.UserTokenSet: %s", err.Error())
|
|
return "", nil, err
|
|
}
|
|
return token, safeUser, nil
|
|
}
|
|
|
|
func AuthLogout(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)
|
|
}
|