Scert/backend/internal/auth/identifier.go

43 lines
1.3 KiB
Go

package auth
import (
"errors"
"net/mail"
"strings"
)
var ErrInvalidIdentifier = errors.New("登录标识无效")
var ErrInvalidCredentials = errors.New("账号或密码错误")
// NormalizeIdentifier 将用户名或邮箱统一为可比较的登录标识。
func NormalizeIdentifier(identifier string) (string, error) {
identifier = strings.TrimSpace(identifier)
if identifier == "" || strings.ContainsAny(identifier, "\r\n") {
return "", ErrInvalidIdentifier
}
if !strings.Contains(identifier, "@") {
return strings.ToLower(identifier), nil
}
identifier = strings.ToLower(identifier)
parsed, err := mail.ParseAddress(identifier)
if err != nil || parsed.Address != identifier || parsed.Name != "" {
return "", ErrInvalidIdentifier
}
parts := strings.Split(identifier, "@")
if len(parts) != 2 || parts[0] == "" || parts[1] == "" {
return "", ErrInvalidIdentifier
}
return identifier, nil
}
// IsMatch 判断登录标识是否匹配指定的用户名或绑定邮箱。
func IsMatch(identifier, username, email string) bool {
normalized, err := NormalizeIdentifier(identifier)
if err != nil {
return false
}
username = strings.ToLower(strings.TrimSpace(username))
email = strings.ToLower(strings.TrimSpace(email))
return normalized == username || (email != "" && normalized == email)
}