2015-02-14 4 views
5

Ich habe eine OAuth2-fähige Website, die Probleme in Bezug darauf, wie IE die 303 Antwort behandelt. Im Ablauf treten 3 Umleitungen auf.IE ignoriert 303 Umleitung in POST -> Redirect -> GET Szenario

### Chrome/Firefox 
POST idp.com/login   (res 302 -> idp.com/authenticate) 
GET idp.com/authenticate (res 302 -> app.com/oauth2/callback) 
GET app.com/oauth2/callback (res 303 -> app.com/home) 
GET app.com/home 

### IE 
POST idp.com/login   (res 302 -> idp.com/authenticate) 
POST idp.com/authenticate (res 302 -> app.com/oauth2/callback) 
POST app.com/oauth2/callback (res 303 -> app.com/home) 
POST app.com/home 

IE scheint aus irgendeinem Grund die ursprüngliche Anfrage-Methode beibehalten. Ich versuchte, von der ursprünglichen POST-Antwort auf meinem Server (app.com) zu brechen, indem ich eine 303 zurückgab, aber das behob das Problem auch nicht. Dies ist unerwartet, da RFC 2068 heißt es, dass für eine 303 - See Other Antwort, soll die folgenden

Die Antwort auf die Anfrage unter einem anderen URI geehrt werden und abgerufen wird unter Verwendung einer GET-Methode auf dieser Ressource gefunden werden kann. Diese Methode existiert hauptsächlich, um die Ausgabe eines POST-aktivierten Skripts zu ermöglichen, den Benutzer-Agent zu einer ausgewählten -Ressource umzuleiten.

Ich versuchte sogar eine 307 Antwort ohne Erfolg. Hat jemand irgendwelche Ideen, was hier passiert?

+0

Sehen Sie ein ähnliches Verhalten bei der Durchführung von OAuth zu LinkedIn - IE ist POST der Rückruf nicht bekommen es. –

+0

verwandte Frage - http://stackoverflow.com/questions/9912200/post-redirect-get-with-internet-explorer aber immer noch keine Antwort –

Antwort

0

Nachdem ich ein ähnliches Problem mit LinkedIn OAuth und meiner Anwendung festgestellt habe, löste ich dies auf besonders unelegante Weise. Ich habe die POST-Methode für meine Callback-Adresse zugelassen und dann intern in meiner Servlet-Implementierung behandelt, als wäre es ein GET-Aufruf.

@RequestMapping(value = ApiValues.LINKEDIN_CALLBACK, method = RequestMethod.POST) 
public void doPost(HttpServletRequest request, HttpServletResponse response, 
     @RequestParam(value = "oauth_token", required = false) String tokenString, 
     @RequestParam(value = "oauth_verifier", required = false) String verifierString) throws ServletException, IOException { 

    handleCallBack(request, response, tokenString, verifierString); 
} 


@RequestMapping(value = ApiValues.LINKEDIN_CALLBACK, method = RequestMethod.GET) 
public void doGet(HttpServletRequest request, HttpServletResponse response, 
     @RequestParam(value = "oauth_token", required = false) String tokenString, 
     @RequestParam(value = "oauth_verifier", required = false) String verifierString) throws ServletException, IOException { 

    handleCallBack(request, response, tokenString, verifierString); 
} 

Noted es scheint nur, dass der IE (und ältere Versionen von IE) dieses Problem bieten, Chrome, Firefox und Safari alle scheinen wie pro spec GET zu umleiten.