Skip to content
Snippets Groups Projects

Implement RFC 6750 instead of custom header for JWT

Merged Daniel Gerhardt requested to merge auth-bearer-token into master
All threads resolved!
Compare and
2 files
+ 21
13
Compare changes
  • Side-by-side
  • Inline
Files
2
@@ -19,6 +19,8 @@
@@ -19,6 +19,8 @@
package de.thm.arsnova.security.jwt;
package de.thm.arsnova.security.jwt;
import java.io.IOException;
import java.io.IOException;
 
import java.util.regex.Matcher;
 
import java.util.regex.Pattern;
import javax.servlet.FilterChain;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequest;
@@ -27,6 +29,7 @@ import javax.servlet.http.HttpServletRequest;
@@ -27,6 +29,7 @@ import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Autowired;
 
import org.springframework.http.HttpHeaders;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Component;
@@ -34,7 +37,7 @@ import org.springframework.web.filter.GenericFilterBean;
@@ -34,7 +37,7 @@ import org.springframework.web.filter.GenericFilterBean;
@Component
@Component
public class JwtTokenFilter extends GenericFilterBean {
public class JwtTokenFilter extends GenericFilterBean {
private static final String JWT_HEADER_NAME = "Arsnova-Auth-Token";
private static final Pattern BEARER_TOKEN_PATTERN = Pattern.compile("Bearer (.*)", Pattern.CASE_INSENSITIVE);
private static final Logger logger = LoggerFactory.getLogger(JwtTokenFilter.class);
private static final Logger logger = LoggerFactory.getLogger(JwtTokenFilter.class);
private JwtAuthenticationProvider jwtAuthenticationProvider;
private JwtAuthenticationProvider jwtAuthenticationProvider;
@@ -48,19 +51,24 @@ public class JwtTokenFilter extends GenericFilterBean {
@@ -48,19 +51,24 @@ public class JwtTokenFilter extends GenericFilterBean {
filterChain.doFilter(servletRequest, servletResponse);
filterChain.doFilter(servletRequest, servletResponse);
return;
return;
}
}
final String jwtHeader = httpServletRequest.getHeader(JWT_HEADER_NAME);
final String jwtHeader = httpServletRequest.getHeader(HttpHeaders.AUTHORIZATION);
if (jwtHeader != null) {
if (jwtHeader != null) {
final JwtToken token = new JwtToken(jwtHeader);
final Matcher tokenMatcher = BEARER_TOKEN_PATTERN.matcher(jwtHeader);
try {
if (tokenMatcher.matches()) {
final Authentication authenticatedToken = jwtAuthenticationProvider.authenticate(token);
final JwtToken token = new JwtToken(tokenMatcher.group(1));
if (authenticatedToken != null) {
try {
logger.debug("Storing JWT to SecurityContext: {}", authenticatedToken);
final Authentication authenticatedToken = jwtAuthenticationProvider.authenticate(token);
SecurityContextHolder.getContext().setAuthentication(authenticatedToken);
if (authenticatedToken != null) {
} else {
logger.debug("Storing JWT to SecurityContext: {}", authenticatedToken);
logger.debug("Could not authenticate JWT.");
SecurityContextHolder.getContext().setAuthentication(authenticatedToken);
 
} else {
 
logger.debug("Could not authenticate JWT.");
 
}
 
} catch (final Exception e) {
 
logger.debug("JWT authentication failed", e);
}
}
} catch (final Exception e) {
} else {
logger.debug("JWT authentication failed", e);
logger.debug("Unsupported authentication scheme.");
}
}
} else {
} else {
logger.debug("No authentication header present.");
logger.debug("No authentication header present.");