Skip to content

Commit 9c91339

Browse files
authored
Merge pull request #15 from Meevent-pe/feature/password-reset
security(auth): Corregir flujo de verificacion de email y reubicacion de entidad
2 parents 2222c29 + 021638f commit 9c91339

5 files changed

Lines changed: 38 additions & 32 deletions

File tree

src/main/java/com/meevent/webapi/Controller/v1/AuthController.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,14 @@ public ResponseEntity<AuthResponse> login(@Valid @RequestBody LoginRequest reque
2929
}
3030

3131
@PostMapping("/register")
32-
public ResponseEntity<AuthResponse> register(@Valid @RequestBody RegisterRequest request) {
33-
AuthResponse response = _authService.register(request);
34-
return ResponseEntity.status(HttpStatus.CREATED).body(response);
32+
public ResponseEntity<String> register(@Valid @RequestBody RegisterRequest request) {
33+
_authService.register(request);
34+
return ResponseEntity.status(HttpStatus.CREATED).body("Registro exitoso. Revisa tu correo para verificar tu cuenta.");
3535
}
3636

37-
3837
//---new endpoint
3938
@PostMapping("/verify-email")
40-
public ResponseEntity<String> verifyEmail(@RequestParam String token) {
41-
_authService.verifyEmail(token);
42-
return ResponseEntity.ok("Cuenta verificada exitosamente");
39+
public ResponseEntity<AuthResponse> verifyEmail(@RequestParam String token) {
40+
return ResponseEntity.ok(_authService.verifyEmail(token));
4341
}
4442
}

src/main/java/com/meevent/webapi/dto/request/VerificationToken.java renamed to src/main/java/com/meevent/webapi/model/VerificationToken.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.meevent.webapi.dto.request;
1+
package com.meevent.webapi.model;
22

33
import java.time.LocalDateTime;
44

@@ -34,7 +34,7 @@ public class VerificationToken {
3434
private User toUser;
3535

3636
private LocalDateTime expiryDate;
37-
37+
3838
private boolean used = false;
3939

4040
public VerificationToken(String token, User user, int expiryHours) {
@@ -43,4 +43,4 @@ public VerificationToken(String token, User user, int expiryHours) {
4343
this.expiryDate = LocalDateTime.now().plusHours(expiryHours); /*<--- */
4444
this.used = false;
4545
}
46-
}
46+
}

src/main/java/com/meevent/webapi/repository/IVerificationTokenRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import org.springframework.data.jpa.repository.JpaRepository;
66
import org.springframework.stereotype.Repository;
77

8-
import com.meevent.webapi.dto.request.VerificationToken;
8+
import com.meevent.webapi.model.VerificationToken;
99

1010
@Repository
1111
public interface IVerificationTokenRepository extends JpaRepository<VerificationToken, Long>{

src/main/java/com/meevent/webapi/service/AuthService.java

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
import java.time.LocalDateTime;
44
import java.util.UUID;
55

6-
import org.springframework.scheduling.annotation.Async;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
78
import org.springframework.security.core.userdetails.UserDetails;
89
import org.springframework.security.core.userdetails.UserDetailsService;
910
import org.springframework.security.crypto.password.PasswordEncoder;
@@ -12,7 +13,7 @@
1213

1314
import com.meevent.webapi.dto.request.LoginRequest;
1415
import com.meevent.webapi.dto.request.RegisterRequest;
15-
import com.meevent.webapi.dto.request.VerificationToken;
16+
import com.meevent.webapi.model.VerificationToken;
1617
import com.meevent.webapi.dto.response.AuthResponse;
1718
import com.meevent.webapi.model.AttendeeProfile;
1819
import com.meevent.webapi.model.City;
@@ -31,6 +32,8 @@
3132
@RequiredArgsConstructor
3233
public class AuthService {
3334

35+
private static final Logger LOGGER = LoggerFactory.getLogger(AuthService.class);
36+
3437
private final IMailService mailService; /* <-- Azure service implementation */
3538
private final IVerificationTokenRepository tokenRepository;
3639
private final IUserRepository userRepository;
@@ -49,7 +52,13 @@ public AuthResponse login(LoginRequest request) {
4952
);
5053

5154
if (!user.getActive()) {
52-
throw new IllegalStateException("Account is disabled");
55+
LOGGER.warn("Login attempt on disabled account: email={}", request.email());
56+
throw new IllegalArgumentException("Invalid credentials");
57+
}
58+
59+
if (user.getVerificationStatus() != UserVerificationStatus.VERIFIED) {
60+
LOGGER.warn("Login attempt on unverified account: email={}", request.email());
61+
throw new IllegalArgumentException("Invalid credentials");
5362
}
5463

5564
if (!passwordEncoder.matches(
@@ -68,8 +77,7 @@ public AuthResponse login(LoginRequest request) {
6877
}
6978

7079
@Transactional
71-
@Async
72-
public AuthResponse register(RegisterRequest request) {
80+
public void register(RegisterRequest request) {
7381

7482
if (userRepository.existsByEmailIgnoreCase(request.email())) {
7583
throw new IllegalArgumentException("Email is already registered");
@@ -97,16 +105,15 @@ public AuthResponse register(RegisterRequest request) {
97105
user.setVerificationStatus(UserVerificationStatus.PENDING); /* <--- change form not_verified to ---> pending */
98106

99107
userRepository.save(user);
108+
LOGGER.info("User registered successfully: email={}", user.getEmail());
100109

101110
String tokenValue = UUID.randomUUID().toString();
102111
VerificationToken token = new VerificationToken(tokenValue, user, 1); /*<--- An hour to expire the token */
103112
tokenRepository.save(token);
104113
String subject = "Verifica tu cuenta en Meevent";
105114
String message = "¡Hola! Gracias por registrarte. Haz clic en el siguiente enlace para verificar tu cuenta: ";
106115

107-
String verificationLink = tokenValue;
108-
109-
mailService.sendVerificationEmail(user.getEmail(), subject, message, verificationLink);
116+
mailService.sendVerificationEmail(user.getEmail(), subject, message, tokenValue);
110117

111118
City city = cityRepository.findById(request.cityId())
112119
.orElseThrow(()
@@ -123,35 +130,36 @@ public AuthResponse register(RegisterRequest request) {
123130
attendeeProfile.setPhoneE164(phoneE164);
124131

125132
attendeeProfileRepository.save(attendeeProfile);
126-
127-
UserDetails userDetails
128-
= userDetailsService.loadUserByUsername(user.getEmail());
129-
130-
return new AuthResponse(
131-
jwtService.generateToken(userDetails)
132-
);
133133
}
134134

135135
@Transactional
136-
public void verifyEmail(String tokenValue) {
136+
public AuthResponse verifyEmail(String tokenValue) {
137137
VerificationToken token = tokenRepository.findByToken(tokenValue)
138-
.orElseThrow(() -> new RuntimeException("Token no encontrado"));
138+
.orElseThrow(() -> {
139+
LOGGER.warn("Verification attempt with unknown token");
140+
return new RuntimeException("Token invalido o expirado");
141+
});
139142

140143
if (token.isUsed()) {
141-
throw new RuntimeException("Este token ya ha sido utilizado");
144+
LOGGER.warn("Verification attempt with used token: tokenId={}", token.getId());
145+
throw new RuntimeException("Token invalido o expirado");
142146
}
143147

144148
if (token.getExpiryDate().isBefore(LocalDateTime.now())) {
145-
throw new RuntimeException("El token ha expirado");
149+
LOGGER.warn("Verification attempt with expired token: tokenId={}", token.getId());
150+
throw new RuntimeException("Token invalido o expirado");
146151
}
147152

148153
// User updated
149154
User user = token.getToUser();
150155
user.setVerificationStatus(UserVerificationStatus.VERIFIED);
151156
userRepository.save(user);
152157

153-
// Change state of token from PENDING to USED creo
158+
// Change state of token from PENDING to USED creo
154159
token.setUsed(true);
155160
tokenRepository.save(token);
161+
162+
UserDetails userDetails = userDetailsService.loadUserByUsername(user.getEmail());
163+
return new AuthResponse(jwtService.generateToken(userDetails));
156164
}
157165
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
spring.profiles.active=${PROFILE}
1+
spring.profiles.active=${PROFILE:dev}

0 commit comments

Comments
 (0)