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, который считается ошибкой, поэтому мы думаем, что получаем ошибку, но ошибка содержит полезную информацию.

Другие вопросы по тегам