303 перенаправление не работает с Angular HTTP POST
Я звоню в службу аутентификации, где я делаю $http.post, который возвращает 303-резонанс, перенаправляя на вызов get, возвращающий ответ.
Когда я выполняю почтовый вызов с использованием Postman, я получаю желаемый ответ, но когда я выполняю угловой $http.post вызов, он возвращает мне ошибку 401 (пользователь не авторизован)
Я что-то упускаю, делая угловой звонок? Кажется, что бэкэнд-сервис работает нормально, так как он работает на Postman.
Вот как выглядит вызов $ http:
$http.post(url, userData).success(function(data, status) {
//handle success
}.error(function(data, status) {
//handle error
});
URL и пользовательские данные построены совершенно нормально в этом случае.
1 ответ
Причина, по которой вы получаете GET
вызов заключается в том, что браузер обрабатывает ответ 303 до того, как угловой может достичь этого. И последовательность обработки сначала идет в браузер, а затем перейти к угловой структуре.
Итак, вкратце, что происходит: вы звоните на сервер -> сервер возвращает ответ 303 -> ваш браузер обрабатывает 303 и делает запрос на некоторый URL (должен быть 'location' в заголовке ответа) -> сервер получает запрос и возвращает авторизованный ответ 401 -> снова браузер сначала получает ответ 401, но на этот раз браузер перенаправляет ответ на угловой -> наконец вы можете получить данные и статус внутри error()
,
Решением для этого может быть переключение на другой код состояния ответа, такой как 2xx, и вы можете получить location
от тела. Затем вы можете сделать перенаправление вручную. Если вы ДОЛЖНЫ использовать 303 или другой 3xx в качестве кода ответа, я не думаю, что в данный момент есть какое-либо эффективное решение, потому что вы не можете многое сделать для браузера. Насколько я знаю, может быть решение на уровне браузера, но я не знаю, когда это произойдет.
Надеюсь, что это может помочь кому-либо иметь подобную проблему, как это, хотя прошло почти год с тех пор, как эта проблема поднималась.
Некоторые другие ссылки: https://groups.google.com/forum/ Существует аналогичное решение, которое вы можете увидеть по ссылке выше.
Я столкнулся с этой проблемой и нашел URL-адрес перенаправления в error
объект после многочасовой борьбы.
loginWithLinkedIn() {
let data = {
// some kind of information here
}
return this.http.get(`https://www.someurl.com/oauth/v2/authorization`).subscribe(res => {
console.log(res)
}, err => {
console.log(err.url) // here is the redirect url
window.location.href = err.url
})
}
Note:
когда вы делаете запрос и получаете ответ 303, который считается ошибкой, поэтому мы думаем, что получаем ошибку, но ошибка содержит полезную информацию.