83 lines
2.0 KiB
Go
83 lines
2.0 KiB
Go
package password
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"trankilou.fr/lassistanoque/backend/internal/domain"
|
|
"trankilou.fr/lassistanoque/backend/internal/service/auth"
|
|
)
|
|
|
|
type PasswordAuthenticator struct {
|
|
tokenManager auth.TokenManager
|
|
userRepository domain.UserRepository
|
|
}
|
|
|
|
func NewPasswordAuthenticator(
|
|
tokenManager auth.TokenManager,
|
|
userRepository domain.UserRepository,
|
|
) *PasswordAuthenticator {
|
|
return &PasswordAuthenticator{
|
|
tokenManager,
|
|
userRepository,
|
|
}
|
|
}
|
|
|
|
func (s *PasswordAuthenticator) Authenticate(ctx context.Context, creds auth.Credentials) (*auth.Session, error) {
|
|
|
|
user, err := s.userRepository.FindUserByEmail(creds.Email)
|
|
if err != nil || !user.Enabled {
|
|
return nil, fmt.Errorf("Unauthorized user %s : %s", creds.Email, err)
|
|
}
|
|
|
|
ok, err := VerifyPassword(creds.Password, user.Password)
|
|
if !ok {
|
|
return nil, fmt.Errorf("Password don't match")
|
|
}
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Error verifying password: %s", err)
|
|
}
|
|
|
|
accessToken, expiresAt, err := s.tokenManager.GenerateAccessToken(user)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Unable to generate access token: %s", err)
|
|
}
|
|
refreshToken, _, err := s.tokenManager.GenerateRefreshToken(user.ID)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Unable to generate refresh token: %s", err)
|
|
}
|
|
|
|
return &auth.Session{
|
|
User: user,
|
|
AccessToken: accessToken,
|
|
RefreshToken: refreshToken,
|
|
ExpiresAt: expiresAt,
|
|
}, nil
|
|
}
|
|
|
|
func (s *PasswordAuthenticator) Register(ctx context.Context, registration auth.Registration) (*auth.Session, error) {
|
|
|
|
hashedPassord, err := HashPassword(registration.Password)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
user := &domain.User{
|
|
Email: registration.Email,
|
|
Firstname: registration.Firstname,
|
|
Lastname: registration.Lastname,
|
|
Password: hashedPassord,
|
|
Enabled: true,
|
|
}
|
|
|
|
// TODO: create team "Espace personnel" and put user in it
|
|
|
|
user, err = s.userRepository.CreateUser(user)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &auth.Session{User: user}, nil
|
|
}
|