Fix OIDC stomp initialization and notification

This commit is contained in:
aditya.chandel
2025-08-29 13:50:09 -06:00
parent 614af906b7
commit bb2c1f4c27
2 changed files with 38 additions and 5 deletions

View File

@@ -2,6 +2,9 @@ package com.adityachandel.booklore.config.security.interceptor;
import com.adityachandel.booklore.config.security.JwtUtils;
import com.adityachandel.booklore.config.security.service.DynamicOidcJwtProcessor;
import com.adityachandel.booklore.mapper.custom.BookLoreUserTransformer;
import com.adityachandel.booklore.model.dto.settings.OidcProviderDetails;
import com.adityachandel.booklore.service.appsettings.AppSettingService;
import com.nimbusds.jwt.JWTClaimsSet;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -29,6 +32,7 @@ public class WebSocketAuthInterceptor implements ChannelInterceptor {
private final JwtUtils jwtUtils;
private final DynamicOidcJwtProcessor dynamicOidcJwtProcessor;
private final AppSettingService appSettingService;
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
@@ -58,16 +62,45 @@ public class WebSocketAuthInterceptor implements ChannelInterceptor {
}
private Authentication authenticateToken(String token) {
if (token == null || token.trim().isEmpty()) {
log.debug("Token is null or empty");
return null;
}
try {
if (jwtUtils.validateToken(token)) {
String username = jwtUtils.extractUsername(token);
return new UsernamePasswordAuthenticationToken(username, null, Collections.singletonList(new SimpleGrantedAuthority("ROLE_USER")));
if (username != null && !username.trim().isEmpty()) {
return new UsernamePasswordAuthenticationToken(username, null, null);
}
log.debug("Username extracted from JWT is null or empty");
}
JWTClaimsSet claims = dynamicOidcJwtProcessor.getProcessor().process(token, null);
if (claims != null) {
String username = claims.getSubject();
return new UsernamePasswordAuthenticationToken(username, null, Collections.singletonList(new SimpleGrantedAuthority("ROLE_USER")));
if (claims == null) {
log.debug("OIDC token processing returned null claims");
return null;
}
OidcProviderDetails providerDetails = appSettingService.getAppSettings().getOidcProviderDetails();
if (providerDetails == null) {
log.debug("OIDC provider details are null");
return null;
}
if (providerDetails.getClaimMapping() == null) {
log.debug("OIDC claim mapping is null");
return null;
}
String usernameClaimKey = providerDetails.getClaimMapping().getUsername();
if (usernameClaimKey == null || usernameClaimKey.trim().isEmpty()) {
log.debug("Username claim key is null or empty");
return null;
}
String username = claims.getStringClaim(usernameClaimKey);
if (username != null && !username.trim().isEmpty()) {
return new UsernamePasswordAuthenticationToken(username, null, null);
}
log.warn("Username extracted from OIDC claims is null or empty");
} catch (Exception e) {
log.debug("Token authentication failed", e);
}

View File

@@ -61,7 +61,7 @@ export function initializeAuthFactory() {
authService.tokenSubject.next(oauthService.getAccessToken());
console.log('[OIDC] Valid access token found after tryLogin');
oauthService.setupAutomaticSilentRefresh();
websocketInitializer(authService);
websocketInitializer(authService)();
authInitService.markAsInitialized();
resolve();
} else {