Гибридное приложение Angular не использует тот же сеанс, что и angularjs.

У меня есть гибридное приложение angular/angularJS, которое, похоже, хорошо работает как просто оболочка для angularjs. В настоящее время мы не используем какие-либо компоненты или службы angular, вся логика по-прежнему существует в angularjs.

В качестве шага к переходу на angular я пытаюсь написать новый компонент для отображения некоторых данных, но я обнаружил, что когда я делаю http-запросы, он, похоже, не использует тот же сеанс, который существует под angularjs . Точно такой же http-запрос в angularJS работает нормально, но в Angular я больше не аутентифицируюсь. Вход/аутентификация происходит по логике AngularJS, но поскольку и angularjs, и angular фактически являются одним и тем же «приложением» после компиляции, я не уверен, как это не работает.

Почему это так и как я могу это исправить? Я понятия не имею, какую информацию/код полезно увидеть в этом сценарии, поскольку я не совсем уверен, что здесь вообще не так.

Это в моем constructor для компонента Angular:

private _listHealthDataUrl: string = "http://localhost:6543/rpc/json/health/get_health_entries";

getData(): Observable<IHealthResponse> {
    return this.http.post<IHealthResponse>(this._listHealthDataUrl, {}, {})
}

И точно такой же запрос из angularJS:

$http({
    url: 'http://localhost:6543/rpc/json/health/get_health_entries',
    method: 'POST',
    data: {}
    }
}).then(function (e) {...})

Заголовки запросов, насколько мне говорит Chrome, точно такие же:

Provisional headers are shown
Accept: application/json, text/plain, */*
Content-Type: application/json;charset=UTF-8
Origin: http://localhost:8080
Referer: http://localhost:8080/health
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36

Заголовки запроса относительно того, что сервер читает:

{'Origin': 'http://localhost:8080', 'Content-Length': '2',
 'Cache-Control': 'no-cache',
 'Accept': 'application/json, text/plain, */*',
 'Content_Length': '2',
 'Referer': 'http://localhost:8080/bloodpressure',
 'Content-Type': 'application/json',
 'X-Appengine-Country': 'ZZ',
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36',
 'Pragma': 'no-cache', 
 'Accept-Language': 'en-US,en;q=0.9', 
 'Host': 'localhost:6543', 
 'Content_Type': 'application/json'}

Опять же, точно так же, за исключением AngularJS, заголовки включают заголовок session. Я не уверен, откуда это взялось на стороне AngularJS или почему Angular не включает его.


person Jer_TX    schedule 25.04.2019    source источник
comment
посмотрите, есть ли у AngularJS перехватчик в маршрутизаторе, который добавляет аутентификацию. В вашем проекте Angular в оболочке вашего запроса API могут отсутствовать файлы cookie или токен носителя для аутентификации. Проверьте все свойства в HTTP-запросе от AngularJS и компонента Angular и посмотрите, какие заголовки отсутствуют.   -  person Andrei    schedule 25.04.2019
comment
В гибридных приложениях AngularJS и Angular существуют как отдельные независимые фреймворки, которые просто взаимодействуют друг с другом. Интересно, сохраняет ли каждая структура свое собственное хранилище, что вызывает проблему. Я бы открыл вкладку хранилища в инструментах разработчика и посмотрел.   -  person    schedule 25.04.2019
comment
@Andrei Глядя на сами заголовки запросов со стороны сервера, они абсолютно идентичны между собой, но сторона AJS отправляет заголовок сеанса (это не то, что я явно делаю в своем коде), и этот заголовок отсутствует в запросе Angular. .   -  person Jer_TX    schedule 25.04.2019
comment
@javascript-sucks Я ничего не вижу в локальном хранилище и хранилище сеансов   -  person Jer_TX    schedule 25.04.2019
comment
@JeremyDavis взгляните на них со стороны клиента на всякий случай через вкладку сети. Я согласен с тем, что серверная сторона должна точно сказать вам, какими должны быть полученные заголовки, но, возможно, это уже после аутентификации, и, возможно, эти данные были удалены. Посмотрите, что отправляет клиент, это должно быть либо а) файл cookie, либо б) специальный заголовок для аутентификации. единственная другая вещь, которая не имеет смысла, - это если аутентификация всегда отправляется как часть тела.   -  person Andrei    schedule 25.04.2019
comment
@JeremyDavis, основываясь на вашем обновлении, у меня есть хорошее предчувствие, что ваш AngularJS использует перехватчик $http для добавления заголовков аутентификации https://docs.angularjs.org/api/ng/service/$http#interceptors попробуйте найти эту логику.   -  person Andrei    schedule 25.04.2019
comment
@Andrei обновил мой вопрос, добавив более подробную информацию. Что касается перехватчика, я сделал ctrl+f во всем проекте/каталоге, и такой логики нет.   -  person Jer_TX    schedule 25.04.2019
comment
@JeremyDavis, давайте работать в обратном порядке, как ваш сервер аутентифицирует клиента? начните с этого и проработайте свой путь, чтобы увидеть, как клиент аутентифицируется. К сожалению, нет единственного способа аутентификации пользователя, поэтому вам нужно сначала выяснить это. Как только вы узнаете, обновите вопрос. Судя по обновленному вопросу с заголовками содержимого, аутентификация отсутствует? можете ли вы показать, что ошибка HTTP должна быть 400 для неавторизованного РЕДАКТИРОВАТЬ: это заголовки HTTP-запроса из инструментов chrome network dev?   -  person Andrei    schedule 25.04.2019
comment
Давайте продолжим обсуждение в чате.   -  person Andrei    schedule 25.04.2019


Ответы (1)


Проблема заключалась в параметрах $http по умолчанию withCredentials. Я ошибся в том, что это был не заголовок session, а куки с именем session. массивный фейспалм.

В angularJS вы можете просто сделать

$http.defaults.withCredentials = true;

изнутри .run(), но кажется, что у angular нет такой вещи. Исправлено использование перехватчика для HttpClient или иное включение withCredentials в раздел опций каждого HTTP-запроса.

person Jer_TX    schedule 25.04.2019