Some minor refactoring of auth-related classes.

This commit is contained in:
Jesse Brault 2024-08-06 10:35:44 -05:00
parent e4bf81d14f
commit 026e3a7ab2
3 changed files with 34 additions and 28 deletions

View File

@ -28,21 +28,25 @@ public final class AuthController {
this.authService = authService;
}
private ResponseEntity<LoginView> getLoginViewResponseEntity(LoginDetails loginDetails) {
final AuthToken refreshToken = loginDetails.getRefreshToken();
final ResponseCookie refreshCookie = getRefreshTokenCookie(
refreshToken.getToken(),
refreshToken.getLifetime()
);
final var loginView = new LoginView(
loginDetails.getUsername(), loginDetails.getAccessToken().getToken()
);
return ResponseEntity.ok()
.header(HttpHeaders.SET_COOKIE, refreshCookie.toString())
.body(loginView);
}
@PostMapping("/login")
public ResponseEntity<LoginView> login(@RequestBody LoginBody loginBody) {
try {
final LoginDetails loginDetails = this.authService.login(loginBody.getUsername(), loginBody.getPassword());
final AuthToken refreshToken = loginDetails.getRefreshToken();
final ResponseCookie refreshCookie = getRefreshTokenCookie(
refreshToken.getToken(),
refreshToken.getLifetime()
);
final var loginView = new LoginView(
loginDetails.getUsername(), loginDetails.getAccessToken().getToken()
);
return ResponseEntity.ok()
.header(HttpHeaders.SET_COOKIE, refreshCookie.toString())
.body(loginView);
return this.getLoginViewResponseEntity(loginDetails);
} catch (LoginException loginException) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
@ -54,15 +58,7 @@ public final class AuthController {
) {
try {
final LoginDetails loginDetails = this.authService.refresh(oldRefreshToken);
final AuthToken newRefreshToken = loginDetails.getRefreshToken();
final ResponseCookie refreshCookie = getRefreshTokenCookie(
newRefreshToken.getToken(),
newRefreshToken.getLifetime()
);
final var loginView = new LoginView(loginDetails.getUsername(), loginDetails.getAccessToken().getToken());
return ResponseEntity.ok()
.header(HttpHeaders.SET_COOKIE, refreshCookie.toString())
.body(loginView);
return this.getLoginViewResponseEntity(loginDetails);
} catch (LoginException loginException) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}

View File

@ -2,7 +2,6 @@ package app.mealsmadeeasy.api.jwt;
import app.mealsmadeeasy.api.security.AuthToken;
import app.mealsmadeeasy.api.security.SimpleAuthToken;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.io.Serializer;
@ -23,7 +22,6 @@ public final class JwtServiceImpl implements JwtService {
private final SecretKey secretKey;
public JwtServiceImpl(
ObjectMapper objectMapper,
@Value("${app.mealsmadeeasy.api.security.access-token-lifetime}") Long accessTokenLifetime,
SecretKey secretKey
) {

View File

@ -2,7 +2,8 @@ package app.mealsmadeeasy.api.security;
import app.mealsmadeeasy.api.jwt.JwtService;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.jsonwebtoken.security.SecurityException;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.JwtException;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
@ -37,6 +38,12 @@ public final class JwtFilter extends OncePerRequestFilter {
this.objectMapper = objectMapper;
}
private void handleSecurityException(HttpServletResponse response, int status, String message) throws IOException {
final SecurityExceptionView view = new SecurityExceptionView(status, message);
response.setStatus(status);
response.getWriter().write(this.objectMapper.writeValueAsString(view));
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
@ -51,11 +58,16 @@ public final class JwtFilter extends OncePerRequestFilter {
final String username;
try {
username = this.jwtService.getSubject(token);
} catch (SecurityException e) {
logger.error("Error while getting username from token.", e);
final SecurityExceptionView view = new SecurityExceptionView(401, e.getMessage());
response.setStatus(401);
response.getWriter().write(this.objectMapper.writeValueAsString(view));
} catch (ExpiredJwtException expiredJwtException) {
this.handleSecurityException(
response,
HttpServletResponse.SC_UNAUTHORIZED,
expiredJwtException.getMessage()
);
return;
} catch (JwtException jwtException) {
logger.error("Error while getting username from token.", jwtException);
this.handleSecurityException(response, HttpServletResponse.SC_UNAUTHORIZED, jwtException.getMessage());
return;
}
final UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);