Scert/backend/internal/auth/service.go

43 lines
1.4 KiB
Go

package auth
import (
"errors"
"strings"
"golang.org/x/crypto/bcrypt"
)
const dummyPasswordHash = "$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy"
type AdminAccount struct {
Username string
Email string
Role string
}
// AuthenticateAdmin 统一执行用户名或邮箱登录,并只返回后端确认的真实权限。
func AuthenticateAdmin(identifier, password, username, email, passwordHash string) (AdminAccount, error) {
return AuthenticateAccount(identifier, password, username, email, passwordHash, "super_admin")
}
// AuthenticateAccount 校验任意已启用账户的登录凭据,并返回其实际角色。
func AuthenticateAccount(identifier, password, username, email, passwordHash, role string) (AdminAccount, error) {
matched := IsMatch(identifier, username, email)
if !matched || strings.TrimSpace(password) == "" || len([]byte(password)) > 256 {
_ = bcrypt.CompareHashAndPassword([]byte(dummyPasswordHash), []byte(password))
return AdminAccount{}, ErrInvalidCredentials
}
if err := bcrypt.CompareHashAndPassword([]byte(passwordHash), []byte(password)); err != nil {
return AdminAccount{}, ErrInvalidCredentials
}
return AdminAccount{
Username: strings.TrimSpace(username),
Email: strings.TrimSpace(email),
Role: role,
}, nil
}
func IsInvalidCredentials(err error) bool {
return errors.Is(err, ErrInvalidCredentials)
}