Muszę ustawić niektóre nagłówki autoryzacji po zalogowaniu użytkownika dla każdego kolejnego żądania.
Aby ustawić nagłówki dla konkretnego żądania,
import {Headers} from 'angular2/http';
var headers = new Headers();
headers.append(headerName, value);
// HTTP POST using these headers
this.http.post(url, data, {
headers: headers
})
// do something with the response
Nie byłoby jednak możliwe ręczne ustawienie nagłówków żądań dla każdego żądania w ten sposób.
Jak ustawić zestaw nagłówków po zalogowaniu się użytkownika, a także usunąć te nagłówki po wylogowaniu?
Odpowiedzi:
Aby odpowiedzieć, pytasz, czy możesz zapewnić usługę, która otacza oryginalny
Http
obiekt z Angulara. Coś jak opisano poniżej.I zamiast wstrzykiwać
Http
obiekt, możesz wstrzyknąć ten (HttpClient
).Myślę też, że można by coś zrobić, korzystając z usług wielu dostawców dla tej
Http
klasy, udostępniając własną klasę rozszerzającą tęHttp
... Zobacz ten link: http://blog.thoughtram.io/angular2/2015/11/23/multi-providers -in-angular-2.html .źródło
Bearer ${token}
, / \ "/ g, '')]);HTTP przechwytujące są teraz dostępne poprzez nowy
HttpClient
z@angular/common/http
, jak kątowego wersji 4.3.x i poza nim .Dodanie nagłówka do każdego żądania jest teraz bardzo proste:
Istnieje zasada niezmienności , dlatego powód należy sklonować przed umieszczeniem na nim czegoś nowego.
Ponieważ edytowanie nagłówków jest bardzo częstym zadaniem, istnieje do niego skrót (podczas klonowania żądania):
const clonedRequest = req.clone({ setHeaders: { Authorization: 'Bearer 123' } });
Po utworzeniu przechwytywacza powinieneś zarejestrować go za pomocą metody
HTTP_INTERCEPTORS
dostarczania.źródło
Rozszerzanie
BaseRequestOptions
może być bardzo pomocne w tym scenariuszu. Sprawdź następujący kod:Powinno to obejmować „My-Custom-Header” w każdym połączeniu.
Aktualizacja:
Aby móc zmienić nagłówek w dowolnym momencie zamiast powyższego kodu, możesz również użyć następującego kodu, aby dodać nowy nagłówek:
możesz usunąć
Istnieje również inna funkcja, której można użyć do ustawienia wartości:
Powyższe rozwiązanie nadal nie jest całkowicie poprawne w kontekście maszynopisu. _defaultHeaders jest chroniony i nie powinien być używany w ten sposób. Poleciłbym powyższe rozwiązanie w celu szybkiej naprawy, ale na dłuższą metę lepiej jest napisać własne opakowanie wokół wywołań http, które również obsługuje uwierzytelnianie. Weź następujący przykład z auth0, który jest lepszy i czysty.
https://github.com/auth0/angular2-jwt/blob/master/angular2-jwt.ts
Aktualizacja - czerwiec 2018 r. Widzę wielu ludzi wybierających to rozwiązanie, ale radziłbym inaczej. Globalne dołączanie nagłówka spowoduje wysłanie tokena uwierzytelniającego do każdego wywołania interfejsu API wychodzącego z aplikacji. Tak więc wywołania interfejsu API przechodzące do wtyczek stron trzecich, takich jak domofon, zendesk lub jakikolwiek inny interfejs API, również zawierają nagłówek autoryzacji. Może to spowodować poważną lukę w zabezpieczeniach. Zamiast tego używaj globalnie przechwytywacza, ale sprawdź ręcznie, czy połączenie wychodzące jest w kierunku punktu końcowego interfejsu API serwera, czy nie, a następnie dołącz nagłówek uwierzytelniania.
źródło
_defaultOptions
jest chroniony, więc nie można go wezwać ze służbyChociaż odpowiadam na to bardzo późno, ale może pomóc komuś innemu. Aby wstawić nagłówki do wszystkich żądań, gdy
@NgModule
są używane, można wykonać następujące czynności:(Przetestowałem to w Angular 2.0.1)
Teraz
@NgModule
wykonaj następujące czynności:źródło
CustomRequestOptions
nawet przy użyciu @ Inject / @ Injectable. Uświadomiłem sobie, że rozwiązaniem byłoby rozszerzenieRequestOptions
, a nie rozszerzenieBaseRequestOptions
. ZapewnianieBaseRequestOptions
nie działa, aleRequestOptions
zamiast tego rozszerzenie powoduje, że DI działa ponownie.Authorization
nagłówek jest ustawiany tylko raz podczas inicjowania aplikacji.W
Angular 2.1.2
I chce tego rozszerzając kątowa http:potem u moich dostawców aplikacji mogłem użyć niestandardowej fabryki, aby zapewnić „HTTP”
teraz nie muszę deklarować każdej metody HTTP i mogę używać
http
normalnie w całej mojej aplikacji.źródło
request()
Metoda, którą są przeciążenia, ma dwa podpisy połączeń ioptions
właściwość jest używana tylko wtedy, gdyurl
określona jako ciąg. W przypadku, gdyurl
jest to wystąpienieRequest
,options
właściwość jest po prostu ignorowana. Może to prowadzić do trudnych do wykrycia błędów. Proszę zobaczyć moją odpowiedź, aby uzyskać więcej informacji.Utwórz niestandardową klasę HTTP, rozszerzając
Http
dostawcę Angular 2 i po prostu przesłoń metodęconstructor
irequest
w swojej niestandardowej klasie HTTP. Poniższy przykład dodajeAuthorization
nagłówek do każdego żądania http.Następnie skonfiguruj urządzenie główne,
app.module.ts
aby podawałoXHRBackend
jakoConnectionBackend
dostawcę iRequestOptions
niestandardową klasę HTTP:Następnie możesz korzystać z niestandardowego dostawcy HTTP w swoich usługach. Na przykład:
Oto obszerny przewodnik - http://adonespitogo.com/articles/angular-2-extending-http-provider/
źródło
setRouter(router)
. Możesz też utworzyć inną klasę i wprowadzić tam niestandardową klasę HTTP zamiast na odwrót.W przypadku Angulara 5 i nowszych możemy użyć HttpInterceptor do uogólnienia operacji żądania i odpowiedzi. Pomaga nam to uniknąć powielania:
1) Wspólne nagłówki
2) Określenie typu odpowiedzi
3) Żądanie zapytania
Możemy użyć tej klasy AuthHttpInterceptor jako dostawcy dla HttpInterceptors:
źródło
Lepiej późno niż wcale ... =)
Możesz przyjąć koncepcję rozszerzonego
BaseRequestOptions
(stąd https://angular.io/docs/ts/latest/guide/server-communication.html#!#override-default-request-options ) i odświeżyć nagłówki „w locie „(nie tylko w konstruktorze). Można użyć zastąpienia właściwości getter / setter „headers” w następujący sposób:źródło
Tak zrobiłem, ustawiając token przy każdym żądaniu.
I zarejestruj się w app.module.ts
źródło
Oto ulepszona wersja zaakceptowanej odpowiedzi, zaktualizowana do Angular2 final:
Oczywiście należy go rozszerzyć na metody takie jak
delete
iput
razie potrzeby (nie potrzebuję ich jeszcze w tym momencie w moim projekcie).Zaletą jest to, że w
get
/post
metodach / ... .Pamiętaj, że w moim przypadku używam plików cookie do uwierzytelnienia. Potrzebowałem nagłówka dla i18n (
Accept-Language
nagłówek), ponieważ wiele wartości zwracanych przez nasz interfejs API zostało przetłumaczonych na język użytkownika. W mojej aplikacji usługa i18n obsługuje język aktualnie wybrany przez użytkownika.źródło
Co powiesz na utrzymanie oddzielnej usługi, jak poniżej
a kiedy dzwonisz do tego z innego miejsca użyj
this.httpClientService.addHeader("Authorization", "Bearer " + this.tok);
a zobaczysz dodany nagłówek, np .: - Autoryzacja w następujący sposób
źródło
Po pewnym dochodzeniu znalazłem ostatni i najłatwiejszy sposób na rozszerzenie,
BaseRequestOptions
które wolę.Oto sposoby, z jakich próbowałem i zrezygnowałem z jakiegoś powodu:
1. Rozszerz
BaseRequestOptions
i dodaj dynamiczne nagłówkiconstructor()
. To nie może działać, jeśli się zaloguję. Zostanie utworzony raz. Więc to nie jest dynamiczne.2. przedłużyć
Http
. Z tego samego powodu, co powyżej, nie mogę dodać dynamicznych nagłówkówconstructor()
. A jeśli przepiszęrequest(..)
metodę i ustawię nagłówki, to tak:Musisz tylko zastąpić tę metodę, ale nie wszystkie metody get / post / put.
3. A moim preferowanym rozwiązaniem jest rozszerzenie
BaseRequestOptions
i zastąpieniemerge()
:Ta
merge()
funkcja zostanie wywołana dla każdego żądania.źródło
BaseRequestOptions
. Niestety nie zadziałało to dla mnie. jakieś możliwe powody?AuthRequestOptions
się z resztą aplikacji? Próbowałem umieścić to wproviders
sekcji, ale nic nie zrobiłem.RequestOptions
, nieBaseRequestOptions
. angular.io/api/http/BaseRequestOptions{ provide: RequestOptions, useClass: AuthRequestOptions }
Chociaż odpowiadam na to bardzo późno, ale jeśli ktoś szuka łatwiejszego rozwiązania.
Możemy użyć angular2-jwt. angular2-jwt przydaje się automatycznie dołączając token JSON Web Token (JWT) jako nagłówek autoryzacji podczas wysyłania żądań HTTP z aplikacji Angular 2.
Możemy ustawić globalne nagłówki z zaawansowaną opcją konfiguracji
I wysyłanie tokena na żądanie jak
źródło
Podoba mi się pomysł zastąpienia domyślnych opcji, wydaje się to dobrym rozwiązaniem.
Jeśli jednak zamierzasz rozszerzyć
Http
klasę. Przeczytaj to!Niektóre odpowiedzi tutaj pokazują nieprawidłowe przeładowanie
request()
metody, co może prowadzić do trudnych do uchwycenia błędów i dziwnego zachowania. Natknąłem się na to sam.To rozwiązanie jest oparte na
request()
implementacji metod w Angular4.2.x
, ale powinno być kompatybilne w przyszłości:Zauważ, że importuję oryginalną klasę w ten sposób
import { Http as NgHttp } from '@angular/http';
, aby zapobiec konfliktom nazw.A oto przykład, jak zarejestrować tę przesłoniętą klasę w kontenerze DI:
Przy takim podejściu możesz wstrzykiwać
Http
normalnie klasę, ale zamiast tego twoja przesłonięta klasa zostanie wstrzyknięta magicznie. Pozwala to na łatwą integrację rozwiązania bez zmiany innych części aplikacji (polimorfizm w akcji).Wystarczy dodać
httpProvider
doproviders
właściwości metadanych modułu.źródło
Najprostszy ze wszystkich
Utwórz
config.ts
plikNastępnie
service
zaimportujconfig.ts
plikMyślę, że to było najprostsze i najbezpieczniejsze.
źródło
Wprowadzono pewne zmiany w wersji kątowej 2.0.1 i nowszej:
źródło
Mogę wybrać prostsze rozwiązanie> Dodaj nowe nagłówki do domyślnych opcji scalania lub wczytywania przez funkcję API ap (get) lub inną.
Oczywiście możesz uzewnętrznić te Nagłówki w domyślnych opcjach lub cokolwiek w swojej klasie. Znajduje się to w generowanym przez Ionic interfejsie API klasy eksportu api.ts @Injectable () {}
Jest bardzo szybki i działa dla mnie. Nie chciałem formatu json / ld.
źródło
Możesz używać
canActive
na swoich trasach:Pobrano z: https://auth0.com/blog/angular/angular-2-authentication
źródło