2015-02-14 1 views
5

У меня есть сайт с поддержкой OAuth2, который испытывает проблемы, связанные с тем, как IE обрабатывает ответ 303. В потоке происходят 3 переадресации.IE игнорирует перенаправление 303 в POST -> перенаправление -> сценарий GET

### 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 по-прежнему поддерживает оригинальный метод запроса. Я попытался хотя бы отрываться от исходного ответа POST на моем сервере (app.com), вернув 303, но это также не решило проблему. Это неожиданно, так как RFC 2068 утверждает, что для 303 - See Other ответа, следующие должны быть выполнены

Ответ на запрос может быть найден под иной URI и ДОЛЖНО быть получен с помощью метода GET на этот ресурс. Этот метод существует прежде всего для того, чтобы позволить выходному сценарию, инициированному POST, , перенаправить агент пользователя на выбранный ресурс .

Я даже пробовал ответ 307 без каких-либо успехов. Кто-нибудь есть идеи о том, что здесь происходит?

+0

видя аналогичное поведение при выполнении OAuth в LinkedIn - IE отправляет обратный вызов, а не GETing. –

+0

Связанный вопрос - http://stackoverflow.com/questions/9912200/post-redirect-get-with-internet-explorer, но ответа еще нет –

ответ

0

столкнувшись с аналогичной проблемой с LinkedIn OAuth и моим приложением, я решил это особенно неэлегантно. Я разрешил метод POST для моего обратного вызова, а затем внутренне в моей реализации сервлета рассматривал его так же, как если бы это был вызов GET.

@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); 
} 

отметил, что это только кажется, что IE (и более старые версии IE) предоставляют эту проблему, Chrome, Firefox и Safari все, кажется, перенаправлять GET согласно спецификации.