public class MacSecuritySigner extends SecuritySigner{
@Override
public String getJwtToken(UserDetails user, JWK jwk) throws JOSEException {
MACSigner jwsSigner = new MACSigner(((OctetSequenceKey)jwk).toSecretKey());
return super.getJwtTokenInternal(jwsSigner, user, jwk);
}
}
@Configuration
public class SignatureConfig {
@Bean
public MacSecuritySigner macSecuritySigner() {
return new MacSecuritySigner();
}
@Bean
public OctetSequenceKey octetSequenceKey() throws JOSEException {
return new OctetSequenceKeyGenerator(256)
.keyID("macKey")
.algorithm(JWSAlgorithm.HS256)
.generate();
}
}
public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
private final SecuritySigner securitySigner;
private final JWK jwk;
public JwtAuthenticationFilter(SecuritySigner securitySigner, JWK jwk) {
this.securitySigner = securitySigner;
this.jwk = jwk;
}
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
ObjectMapper mapper = new ObjectMapper();
LoginDto loginDto;
try {
loginDto = mapper.readValue(request.getInputStream(), LoginDto.class);
} catch (IOException e) {
throw new RuntimeException(e);
}
UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(loginDto.getUsername(), loginDto.getPassword());
return getAuthenticationManager().authenticate(authenticationToken);
}
@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response,
FilterChain chain, Authentication authResult) throws IOException, ServletException {
String jwtToken;
User user = (User) authResult.getPrincipal();
try {
jwtToken = securitySigner.getJwtToken(user, jwk);
response.addHeader("Authorization", "Bearer " + jwtToken);
} catch (JOSEException e) {
throw new RuntimeException(e);
}
}
}