11package eu .webeid .example .security .ui ;
22
3- import eu .webeid .example .security .state .MobileAuthStateStore ;
4- import eu .webeid .security .challenge .ChallengeNonceStore ;
53import jakarta .servlet .FilterChain ;
64import jakarta .servlet .ServletException ;
75import jakarta .servlet .http .HttpServletRequest ;
108import org .slf4j .LoggerFactory ;
119import org .springframework .http .HttpMethod ;
1210import org .springframework .lang .NonNull ;
11+ import org .springframework .security .web .csrf .CsrfToken ;
1312import org .springframework .security .web .servlet .util .matcher .PathPatternRequestMatcher ;
1413import org .springframework .security .web .util .matcher .RequestMatcher ;
1514import org .springframework .web .filter .OncePerRequestFilter ;
1918public final class WebEidLoginPageGeneratingFilter extends OncePerRequestFilter {
2019 private static final Logger LOG = LoggerFactory .getLogger (WebEidLoginPageGeneratingFilter .class );
2120 private final RequestMatcher requestMatcher = PathPatternRequestMatcher .withDefaults ().matcher (HttpMethod .GET , "/auth/eid/login" );
22- private final MobileAuthStateStore stateStore ;
23- private final ChallengeNonceStore challengeNonceStore ;
2421 private static final String LOGIN_PAGE_HTML = """
2522 <!doctype html>
2623 <html lang="en">
@@ -38,7 +35,9 @@ public final class WebEidLoginPageGeneratingFilter extends OncePerRequestFilter
3835
3936 let payload;
4037 try { payload = JSON.parse(atob(frag)); } catch (e) {
41- location.replace("/?mobileAuthError=bad_payload"); return;
38+ console.error("Failed to parse payload", e);
39+ location.replace("/?mobileAuthError=bad_payload");
40+ return;
4241 }
4342
4443 const csrfToken = document.querySelector('#csrftoken').content;
@@ -48,24 +47,28 @@ public final class WebEidLoginPageGeneratingFilter extends OncePerRequestFilter
4847
4948 fetch("/auth/login", {
5049 method: "POST",
51- headers: { "Content-Type": "application/json", [csrfHeaderName]: csrfToken },
50+ headers: {
51+ "Content-Type": "application/json",
52+ [csrfHeaderName]: csrfToken
53+ },
5254 body: JSON.stringify({ "auth-token": authToken }),
5355 credentials: "include"
5456 })
55- .then(r => { if (!r.ok) throw new Error("HTTP " + r.status); location.replace("/welcome"); })
56- .catch(() => location.replace("/?mobileAuthError=login_failed"));
57+ .then(r => {
58+ if (!r.ok) throw new Error("HTTP " + r.status);
59+ window.location.replace("/welcome");
60+ })
61+ .catch(e => {
62+ console.error("Login failed", e);
63+ window.location.replace("/?mobileAuthError=login_failed");
64+ });
5765 })();
5866 </script>
5967 Signing you in…
6068 </body>
6169 </html>
6270 """ ;
6371
64- public WebEidLoginPageGeneratingFilter (MobileAuthStateStore stateStore , ChallengeNonceStore challengeNonceStore ) {
65- this .stateStore = stateStore ;
66- this .challengeNonceStore = challengeNonceStore ;
67- }
68-
6972 @ Override
7073 protected void doFilterInternal (@ NonNull HttpServletRequest request , @ NonNull HttpServletResponse response , @ NonNull FilterChain chain )
7174 throws IOException , ServletException {
@@ -74,22 +77,19 @@ protected void doFilterInternal(@NonNull HttpServletRequest request, @NonNull Ht
7477 return ;
7578 }
7679
77- String state = request .getParameter ("state" );
78- if (state != null && !state .isBlank ()) {
79- var challenge = stateStore .consume (state );
80- var session = request .getSession (true );
81- var sid = (session != null ? session .getId () : "null" );
82- if (challenge != null ) {
83- challengeNonceStore .put (challenge );
84- LOG .info ("LOGIN PAGE: rehydrated challenge via state={}, sessionId={}" , state , sid );
85- } else {
86- LOG .warn ("LOGIN PAGE: state missing/expired: {}, sessionId={}" , state , sid );
87- }
80+ var session = request .getSession (false );
81+ LOG .info ("LOGIN PAGE: rendering login page for sessionId={}" , session != null ? session .getId () : "null" );
82+
83+ var csrf = (CsrfToken ) request .getAttribute (CsrfToken .class .getName ());
84+ if (csrf == null ) {
85+ csrf = (CsrfToken ) request .getAttribute ("_csrf" );
8886 }
8987
90- var csrf = (org .springframework .security .web .csrf .CsrfToken ) request .getAttribute (org .springframework .security .web .csrf .CsrfToken .class .getName ());
91- if (csrf == null ) csrf = (org .springframework .security .web .csrf .CsrfToken ) request .getAttribute ("_csrf" );
92- String html = generateHtml (csrf != null ? csrf .getToken () : "" , csrf != null ? csrf .getHeaderName () : "X-CSRF-TOKEN" );
88+ String html = generateHtml (
89+ csrf != null ? csrf .getToken () : "" ,
90+ csrf != null ? csrf .getHeaderName () : "X-CSRF-TOKEN"
91+ );
92+
9393 response .setContentType ("text/html;charset=UTF-8" );
9494 response .getWriter ().write (html );
9595 }
0 commit comments