2017-08-29 4 views
0

Ich benutze einen Filter, um zu prüfen, ob ein Autorisierung Bearer-Token gültig ist. Nichtsdestotrotz kämpfe ich mit der Tatsache, dass User-Agent (Firefox, Chrome ...) versucht, eine CORS OPTIONS-Anfrage anzufordern, bevor die "echte" Anfrage gemacht wird.Sollte Bearer-Token-Filter die OPTIONS-Anfrage umgehen?

So fängt mein Filter diese OPTIONS-Anfrage ab, und es hat kein Autorisierungs-Bearer-Token, also antwortet es mit einem 4xx-HTTP-Code.

Sollte ich vermeiden OPTIONS Anfragen?

private boolean isExcluded(ServletRequest request) { 
    return ((HttpServletRequest)request).getMethod().equalsIgnoreCase(HttpMethod.OPTIONS); 
} 

Auf doFilter:

if (this.isExcluded(request)) 
    chain.doFilter(request, response); 
else 
    //... 

Ist das richtig?

Antwort

1

Jede CORS-Verarbeitung sollte vor jeder Authentifizierung durchgeführt werden. Der richtige Weg, um es zu implementieren wäre ein CORS-Filter vor beliebigen Auth-Filter. Überprüfen Sie im CORS-Filter, ob es sich um eine Preflight-Anfrage handelt. Wenn dies der Fall ist, antworten Sie mit 200 und legen Sie die CORS-Antwortheader fest. Kehren Sie dann vom Filter zurück, so dass keine weitere Verarbeitung stattfindet. Wenn es sich nicht um eine Preflight-Anfrage handelt, gehen Sie einfach zum nächsten Filter in der Kette.

CORS-Filter nur auf der Response-Seite implementiert und lassen Sie die Anfrage wie üblich schlechte Implementierungen gehen. Zum Beispiel ist my post here ein wirklich schlechtes Beispiel. Deshalb habe ich als Beispiel dafür, wie es sollte implementiert werden, mit der verbunden.

Weitere Informationen zum CORS-Preflight finden Sie unter the MDN (MUSS gelesen werden, wenn Sie verstehen möchten, wie es funktionieren soll). Untersuche dann den RESTEasy CorsFilter, um zu sehen, wie er korrekt implementiert wird. Obwohl es einen JAX-RS-Filter verwendet, können Sie einige Ideen erhalten, damit es mit dem Servlet-Filter funktioniert. Der Unterschied zu beachten ist, dass die JAX-RS-Filter in zwei Filter (Anfrage und Antwort) aufgeteilt sind, während Servlet-Filter auf Filter verwenden, wo Sie vor -> Handle Anfrage -> Post-Prozess. Die JAX-RS Filter sind wie die Vor- und Nachbearbeitung.

Beachten Sie auch, dass eine OPTIONS-Anfrage nicht immer ein Preflight ist. Sie sollten auch nach dem Origin Header suchen.

Verwandte Themen