@@ -26,6 +26,8 @@ public class CsrfFilter implements ContainerRequestFilter, ContainerResponseFilt
2626 private static final Logger logger = LogManager .getLogger (CsrfFilter .class );
2727 private static final String CSRF_TOKEN_HEADER = "x-csrf-token" ;
2828 private static final String CSRF_COOKIE_NAME = "XSRF-TOKEN" ;
29+ private static final String CLIENT_TYPE_HEADER = "X-Client-Type" ;
30+ private static final String WEB_CLIENT = "web" ;
2931 private static final String IS_PUBLIC_PROPERTY = "isPublic" ;
3032
3133 // Stockage en mémoire (session utilisateur -> token)
@@ -45,6 +47,11 @@ public void filter(ContainerRequestContext requestContext) throws IOException {
4547 return ;
4648 }
4749
50+ if (!isWebClient (requestContext )) {
51+ logger .debug ("Client non-web détecté - skip CSRF pour: {} {}" , method , path );
52+ return ;
53+ }
54+
4855 // Récupérer la session utilisateur
4956 String sessionId = getSessionId (requestContext );
5057 if (sessionId == null ) {
@@ -72,7 +79,7 @@ public void filter(ContainerRequestContext requestContext,
7279 String sessionId = getSessionId (requestContext );
7380
7481 // Pour les requêtes GET, générer un nouveau token si besoin
75- if ("GET" .equals (requestContext .getMethod ()) && sessionId != null ) {
82+ if ("GET" .equals (requestContext .getMethod ()) && sessionId != null && isWebClient ( requestContext ) ) {
7683 String token = generateToken ();
7784 tokenStore .put (sessionId , token );
7885 responseContext .getHeaders ().add (CSRF_TOKEN_HEADER , token );
@@ -89,6 +96,11 @@ public boolean isPublic(ContainerRequestContext requestContext) {
8996 return Boolean .TRUE .equals (property ) || "true" .equals (property .toString ());
9097 }
9198
99+ private boolean isWebClient (ContainerRequestContext requestContext ) {
100+ String clientType = requestContext .getHeaderString (CLIENT_TYPE_HEADER );
101+ return WEB_CLIENT .equalsIgnoreCase (clientType );
102+ }
103+
92104 /**
93105 * Supprime l'ancien cookie XSRF-TOKEN non sécurisé
94106 */
@@ -98,7 +110,7 @@ private void clearInsecureCookie(ContainerResponseContext responseContext) {
98110 .path ("/" )
99111 .maxAge (0 ) // Expire immédiatement
100112 .build ();
101- responseContext .getHeaders ().add ("Set-Cookie" , deleteCookie . toString () );
113+ responseContext .getHeaders ().add ("Set-Cookie" , deleteCookie );
102114 }
103115
104116 private String getSessionId (ContainerRequestContext request ) {
@@ -108,12 +120,9 @@ private String getSessionId(ContainerRequestContext request) {
108120 return sessionCookie .getValue ();
109121 }
110122
111- // Ou depuis le header Authorization si tu utilises JWT
112123 String authHeader = request .getHeaderString ("Authorization" );
113124 if (authHeader != null && authHeader .startsWith ("Bearer " )) {
114- // Pour JWT, utiliser le token complet ou un hash
115125 String jwtToken = authHeader .substring (7 );
116- // Hash le JWT pour avoir un ID de session plus court
117126 return Integer .toHexString (jwtToken .hashCode ());
118127 }
119128
0 commit comments