Wydaje się, że Angularjs $ http nie rozumie w odpowiedzi „Set-Cookie”


Mam nodejs express REST API z modułem paszportowym do uwierzytelniania.
Metoda logowania (GET) zwraca plik cookie w nagłówku. Kiedy dzwonię z Chrome, działa dobrze, mój plik cookie jest ustawiony w mojej przeglądarce.
Ale jeśli wywołam to przez $ http z Angularjs, plik cookie nie jest ustawiony.
Set-Cookie:connect.sid=s%3Ad7cZf3DSnz-IbLA_eNjQr-YR.R%2FytSJyd9cEhX%2BTBkmAQ6WFcEHAuPJjdXk3oq3YyFfI; Path=/; HttpOnly

Jak widać powyżej, Set-Cookie jest obecny w nagłówku odpowiedzi usługi http.
Być może HttpOnly może być źródłem tego problemu? Jeśli tak, jak mogę to zmienić? Oto moja konfiguracja ekspresowa:
app.configure(function () {
app.use(allowCrossDomain);
app.use(express.bodyParser());
app.use(express.cookieParser())
app.use(express.session({ secret: 'this is a secret' }));
app.use(flash());
//passport init
app.use(passport.initialize());
app.use(passport.session());
app.set('port', process.env.PORT || 8080);
});

Dziękuję za pomoc
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Pamiętaj, aby skonfigurować żądanie $ http tak, aby korzystało z poświadczeń.
Z dokumentacji XHR:
https://developer.mozilla.org/Ан-US/docs/HTTP/Access_control_CORS
https://developer.mozilla.org/ ... dziej interesująca funkcja udostępniana przez XMLHttpRequest i
kontrola dostępu to możliwość dokonywania „poświadczonych” żądań, które
wiedzieć o plikach cookie HTTP i informacjach uwierzytelniających HTTP. Przez
Domyślnie w trybie pośrednich wywołuje XMLHTTPREQUEQUEQUEST
wyśle ​​poświadczenia. W XMLHttpRequest należy ustawić konkretną flagę
obiekt, gdy jest wywoływany.

Możesz użyć obiektu opcji, aby skonfigurować użycie poświadczeń, patrz
http://docs.angularjs.org/api/ NG. $ http
http://docs.angularjs.org/api/ng.%24http
Przykład:
$http({withCredentials: true, ...}).get(...)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jak sprawdzić, czy nie ma pliku cookie?
$ http
to po prostu opakowanie wokół przeglądarki XHR, podobnie jak jQuery
$ .ajax
i przyjaciele. Oznacza to, że Twoja przeglądarka będzie obsługiwać pliki cookie w zwykły sposób.
Zakładam ciasteczko
jest zainstalowany, ale próbujesz odczytać go za pomocą
document.cookie
.
HttpOnly
uniemożliwia skryptowi dostęp do pliku cookie.

To coś dobrego.

HttpOnly
pomaga złagodzić ataki XSS. Uniemożliwia to złośliwemu skryptowi kradzież tokenu sesji użytkownika (a tym samym jego loginu).

Nie wyłączaj
HttpOnly
.

I tak nie potrzebujesz plików cookie. Ponieważ
$ http
to tylko opakowanie wokół XHR, przeglądarka automatycznie wyśle ​​plik cookie przy następnym żądaniu. Możesz to sprawdzić, przeglądając żądania na pasku narzędzi programisty online.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Rozwiązałem ten problem, ustawiając
{withCredential: true}
w żądaniu kątowym
$ http
i ustawiając:
res.header("Access-Control-Allow-Credentials", true);

w mojej konfiguracji serwera ekspresowego. W ten sposób mój plik cookie jest dobrze widoczny na liście plików cookie mojej przeglądarki.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Poniższe rozwiązanie zadziałało dla mnie
W

Angular

Na moją prośbę użyłem następującego fragmentu kodu, używając
withCredentials: true
.
this._http.post(this._apiUrl + 'api/' + url, data, { withCredentials: true })
.subscribe(data => { resolve(data) }, error => { this.showServerError(error)})

W węźle, zanim otrzymałem rozwiązanie, właśnie zainicjowałem CORS

od

Wsparcie
app.use(cors());

Ale teraz zaimplementowałem następujący fragment kodu
app.use(cors({origin: [
"[url=http://localhost:5000"]http://localhost:5000"[/url]
], credentials: true}))
Gdzie

http://localhost:5000
http://localhost:5000
to punkt końcowy mojej aplikacji Angular. ty
możesz ustawić ten adres URL dynamicznie z pliku config lub .env.

Mam nadzieję, że powyższe rozwiązanie działa w przypadku Twojego problemu.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz to zmienić, dostosowując
express.session
:
app.use(express.session({
secret : 'this is a secret',
cookie : {
httpOnly : false,
maxAge : XXX// see text
}
});

Ale nie sądzę, żeby Angular zbytnio dbał o pliki cookie, są obsługiwane przez przeglądarkę (i zgadzam się z @ josh3736, że należy zapisać
httpOnly
jako
true
).
Może to mieć coś wspólnego z faktem, że pliki cookie są plikami cookie sesji (przeglądarki). Możesz spróbować sprawdzić, czy działa lepiej, jawnie ustawiając
maxAge
dla pliku cookie (w milisekundach).

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się