Skip to content

Commit b88af9b

Browse files
NFC-47 Review findings. Replace mockNfcAuthToken with mockV11AuthToken. Replace VALID_NFC_AUTH_TOKEN with VALID_WEB_EID_1_1AUTH_TOKEN. Return html with spring security filter.
1 parent d6b26b8 commit b88af9b

File tree

6 files changed

+86
-40
lines changed

6 files changed

+86
-40
lines changed

example/src/main/java/eu/webeid/example/config/ApplicationConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import eu.webeid.example.security.AuthTokenDTOAuthenticationProvider;
2626
import eu.webeid.example.security.WebEidAjaxLoginProcessingFilter;
27+
import eu.webeid.example.security.ui.WebEidLoginPageGeneratingFilter;
2728
import org.springframework.context.annotation.Bean;
2829
import org.springframework.context.annotation.Configuration;
2930
import org.springframework.http.HttpMethod;
@@ -64,6 +65,7 @@ SecurityFilterChain filterChain(
6465
.anyRequest().authenticated()
6566
)
6667
.authenticationProvider(provider)
68+
.addFilterBefore(new WebEidLoginPageGeneratingFilter(), UsernamePasswordAuthenticationFilter.class)
6769
.addFilterBefore(filter, UsernamePasswordAuthenticationFilter.class)
6870
.headers(h -> h.frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin))
6971
.logout(l -> l.logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler()))
@@ -74,7 +76,6 @@ SecurityFilterChain filterChain(
7476
public void addViewControllers(ViewControllerRegistry registry) {
7577
registry.addViewController("/").setViewName("index");
7678
registry.addViewController("/welcome").setViewName("welcome");
77-
registry.addViewController("/auth/eid/login").setViewName("eid-login");
7879
}
7980

8081
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package eu.webeid.example.security.ui;
2+
3+
import jakarta.servlet.FilterChain;
4+
import jakarta.servlet.ServletException;
5+
import jakarta.servlet.http.HttpServletRequest;
6+
import jakarta.servlet.http.HttpServletResponse;
7+
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
8+
import org.springframework.security.web.util.matcher.RequestMatcher;
9+
import org.springframework.web.filter.OncePerRequestFilter;
10+
11+
import java.io.IOException;
12+
import java.nio.charset.StandardCharsets;
13+
14+
public final class WebEidLoginPageGeneratingFilter extends OncePerRequestFilter {
15+
16+
private final RequestMatcher requestMatcher = new AntPathRequestMatcher("/auth/eid/login", "GET");
17+
private static final String LOGIN_PAGE_HTML = """
18+
<!doctype html>
19+
<html lang="en">
20+
<head>
21+
<meta charset="utf-8">
22+
<meta name="viewport" content="width=device-width, initial-scale=1">
23+
<title>Signing you in…</title>
24+
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline'; connect-src 'self'; img-src 'self'; style-src 'self' 'unsafe-inline'; base-uri 'self'; form-action 'self';">
25+
</head>
26+
<body>
27+
<script>
28+
(function () {
29+
const frag = location.hash ? location.hash.substring(1) : "";
30+
if (!frag) { location.replace("/?mobileAuthError=missing_payload"); return; }
31+
32+
let payload;
33+
try { payload = JSON.parse(atob(frag)); } catch (e) {
34+
location.replace("/?mobileAuthError=bad_payload"); return;
35+
}
36+
37+
const authToken = payload["auth-token"] ?? payload;
38+
39+
fetch("/auth/login", {
40+
method: "POST",
41+
headers: { "Content-Type": "application/json" },
42+
body: JSON.stringify({ "auth-token": authToken })
43+
})
44+
.then(r => {
45+
if (!r.ok) throw new Error("HTTP " + r.status);
46+
location.replace("/welcome");
47+
})
48+
.catch(() => location.replace("/?mobileAuthError=login_failed"));
49+
})();
50+
</script>
51+
Signing you in…
52+
</body>
53+
</html>
54+
""";
55+
56+
@Override
57+
protected void doFilterInternal(HttpServletRequest request,
58+
HttpServletResponse response,
59+
FilterChain filterChain)
60+
throws ServletException, IOException {
61+
62+
if (!this.requestMatcher.matches(request)) {
63+
filterChain.doFilter(request, response);
64+
return;
65+
}
66+
67+
String html = generateHtml();
68+
byte[] bytes = html.getBytes(StandardCharsets.UTF_8);
69+
response.setContentType("text/html;charset=UTF-8");
70+
response.setContentLength(bytes.length);
71+
response.getOutputStream().write(bytes);
72+
}
73+
74+
private String generateHtml() {
75+
return LOGIN_PAGE_HTML;
76+
}
77+
}

example/src/main/resources/templates/eid-login.html

Lines changed: 0 additions & 32 deletions
This file was deleted.

example/src/test/java/eu/webeid/example/WebApplicationTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ public FileDTO signContainer(SignatureDTO signatureDTO) {
171171
MockHttpSession session = new MockHttpSession();
172172
session.setAttribute("challenge-nonce", new ChallengeNonce(ObjectMother.VALID_CHALLENGE_NONCE, DateAndTime.utcNow().plusMinutes(1)));
173173

174-
MvcResult result = HttpHelper.login(mvcBuilder, session, ObjectMother.mockNfcAuthToken());
174+
MvcResult result = HttpHelper.login(mvcBuilder, session, ObjectMother.mockV11AuthToken());
175175
MockHttpServletResponse response = result.getResponse();
176176
assertEquals("{\"sub\":\"JAAK-KRISTJAN JÕEORG\",\"auth\":\"[ROLE_USER]\"}", response.getContentAsString());
177177
}

example/src/test/java/eu/webeid/example/security/WebEidAjaxLoginProcessingFilterTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,13 @@ void testAttemptAuthentication() throws Exception {
6262
}
6363

6464
@Test
65-
void testAttemptAuthentication_NfcToken() throws Exception {
65+
void testAttemptAuthentication_V11AuthToken() throws Exception {
6666
final HttpServletRequest request = mock(HttpServletRequest.class);
6767
final HttpServletResponse response = mock(HttpServletResponse.class);
6868
when(request.getMethod()).thenReturn(HttpMethod.POST.name());
6969
when(request.getHeader("Content-type")).thenReturn("application/json");
7070

71-
var jsonBody = ObjectMother.toJson(Map.of("auth-token", ObjectMother.mockNfcAuthToken().getToken()));
71+
var jsonBody = ObjectMother.toJson(Map.of("auth-token", ObjectMother.mockV11AuthToken().getToken()));
7272

7373
when(request.getReader()).thenReturn(new BufferedReader(new StringReader(jsonBody)));
7474

example/src/test/java/eu/webeid/example/testutil/ObjectMother.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public class ObjectMother {
4848
private static final String TEST_PKI_CONTAINER = "src/test/resources/signout.p12";
4949
private static final String TEST_PKI_CONTAINER_PASSWORD = "test";
5050
private static final WebEidAuthToken VALID_AUTH_TOKEN;
51-
private static final WebEidAuthToken VALID_NFC_AUTH_TOKEN;
51+
private static final WebEidAuthToken VALID_WEB_EID_1_1AUTH_TOKEN;
5252

5353
static {
5454
try {
@@ -66,7 +66,7 @@ public class ObjectMother {
6666

6767
static {
6868
try {
69-
VALID_NFC_AUTH_TOKEN = MAPPER.readValue(
69+
VALID_WEB_EID_1_1AUTH_TOKEN = MAPPER.readValue(
7070
"{\"algorithm\":\"ES384\"," +
7171
"\"unverifiedCertificate\":\"MIIEBDCCA2WgAwIBAgIQY5OGshxoPMFg+Wfc0gFEaTAKBggqhkjOPQQDBDBgMQswCQYDVQQGEwJFRTEbMBkGA1UECgwSU0sgSUQgU29sdXRpb25zIEFTMRcwFQYDVQRhDA5OVFJFRS0xMDc0NzAxMzEbMBkGA1UEAwwSVEVTVCBvZiBFU1RFSUQyMDE4MB4XDTIxMDcyMjEyNDMwOFoXDTI2MDcwOTIxNTk1OVowfzELMAkGA1UEBhMCRUUxKjAoBgNVBAMMIUrDlUVPUkcsSkFBSy1LUklTVEpBTiwzODAwMTA4NTcxODEQMA4GA1UEBAwHSsOVRU9SRzEWMBQGA1UEKgwNSkFBSy1LUklTVEpBTjEaMBgGA1UEBRMRUE5PRUUtMzgwMDEwODU3MTgwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQmwEKsJTjaMHSaZj19hb9EJaJlwbKc5VFzmlGMFSJVk4dDy+eUxa5KOA7tWXqzcmhh5SYdv+MxcaQKlKWLMa36pfgv20FpEDb03GCtLqjLTRZ7649PugAQ5EmAqIic29CjggHDMIIBvzAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIDiDBHBgNVHSAEQDA+MDIGCysGAQQBg5EhAQIBMCMwIQYIKwYBBQUHAgEWFWh0dHBzOi8vd3d3LnNrLmVlL0NQUzAIBgYEAI96AQIwHwYDVR0RBBgwFoEUMzgwMDEwODU3MThAZWVzdGkuZWUwHQYDVR0OBBYEFPlp/ceABC52itoqppEmbf71TJz6MGEGCCsGAQUFBwEDBFUwUzBRBgYEAI5GAQUwRzBFFj9odHRwczovL3NrLmVlL2VuL3JlcG9zaXRvcnkvY29uZGl0aW9ucy1mb3ItdXNlLW9mLWNlcnRpZmljYXRlcy8TAkVOMCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDAfBgNVHSMEGDAWgBTAhJkpxE6fOwI09pnhClYACCk+ezBzBggrBgEFBQcBAQRnMGUwLAYIKwYBBQUHMAGGIGh0dHA6Ly9haWEuZGVtby5zay5lZS9lc3RlaWQyMDE4MDUGCCsGAQUFBzAChilodHRwOi8vYy5zay5lZS9UZXN0X29mX0VTVEVJRDIwMTguZGVyLmNydDAKBggqhkjOPQQDBAOBjAAwgYgCQgDCAgybz0u3W+tGI+AX+PiI5CrE9ptEHO5eezR1Jo4j7iGaO0i39xTGUB+NSC7P6AQbyE/ywqJjA1a62jTLcS9GHAJCARxN4NO4eVdWU3zVohCXm8WN3DWA7XUcn9TZiLGQ29P4xfQZOXJi/z4PNRRsR4plvSNB3dfyBvZn31HhC7my8woi\"," +
7272
"\"unverifiedSigningCertificate\":\"MIIEBDCCA2WgAwIBAgIQY5OGshxoPMFg+Wfc0gFEaTAKBggqhkjOPQQDBDBgMQswCQYDVQQGEwJFRTEbMBkGA1UECgwSU0sgSUQgU29sdXRpb25zIEFTMRcwFQYDVQRhDA5OVFJFRS0xMDc0NzAxMzEbMBkGA1UEAwwSVEVTVCBvZiBFU1RFSUQyMDE4MB4XDTIxMDcyMjEyNDMwOFoXDTI2MDcwOTIxNTk1OVowfzELMAkGA1UEBhMCRUUxKjAoBgNVBAMMIUrDlUVPUkcsSkFBSy1LUklTVEpBTiwzODAwMTA4NTcxODEQMA4GA1UEBAwHSsOVRU9SRzEWMBQGA1UEKgwNSkFBSy1LUklTVEpBTjEaMBgGA1UEBRMRUE5PRUUtMzgwMDEwODU3MTgwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQmwEKsJTjaMHSaZj19hb9EJaJlwbKc5VFzmlGMFSJVk4dDy+eUxa5KOA7tWXqzcmhh5SYdv+MxcaQKlKWLMa36pfgv20FpEDb03GCtLqjLTRZ7649PugAQ5EmAqIic29CjggHDMIIBvzAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIDiDBHBgNVHSAEQDA+MDIGCysGAQQBg5EhAQIBMCMwIQYIKwYBBQUHAgEWFWh0dHBzOi8vd3d3LnNrLmVlL0NQUzAIBgYEAI96AQIwHwYDVR0RBBgwFoEUMzgwMDEwODU3MThAZWVzdGkuZWUwHQYDVR0OBBYEFPlp/ceABC52itoqppEmbf71TJz6MGEGCCsGAQUFBwEDBFUwUzBRBgYEAI5GAQUwRzBFFj9odHRwczovL3NrLmVlL2VuL3JlcG9zaXRvcnkvY29uZGl0aW9ucy1mb3ItdXNlLW9mLWNlcnRpZmljYXRlcy8TAkVOMCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDAfBgNVHSMEGDAWgBTAhJkpxE6fOwI09pnhClYACCk+ezBzBggrBgEFBQcBAQRnMGUwLAYIKwYBBQUHMAGGIGh0dHA6Ly9haWEuZGVtby5zay5lZS9lc3RlaWQyMDE4MDUGCCsGAQUFBzAChilodHRwOi8vYy5zay5lZS9UZXN0X29mX0VTVEVJRDIwMTguZGVyLmNydDAKBggqhkjOPQQDBAOBjAAwgYgCQgDCAgybz0u3W+tGI+AX+PiI5CrE9ptEHO5eezR1Jo4j7iGaO0i39xTGUB+NSC7P6AQbyE/ywqJjA1a62jTLcS9GHAJCARxN4NO4eVdWU3zVohCXm8WN3DWA7XUcn9TZiLGQ29P4xfQZOXJi/z4PNRRsR4plvSNB3dfyBvZn31HhC7my8woi\"," +
@@ -88,9 +88,9 @@ public static AuthTokenDTO mockAuthToken() {
8888
return authToken;
8989
}
9090

91-
public static AuthTokenDTO mockNfcAuthToken() {
91+
public static AuthTokenDTO mockV11AuthToken() {
9292
AuthTokenDTO authToken = new AuthTokenDTO();
93-
authToken.setToken(VALID_NFC_AUTH_TOKEN);
93+
authToken.setToken(VALID_WEB_EID_1_1AUTH_TOKEN);
9494
return authToken;
9595
}
9696

0 commit comments

Comments
 (0)