Ich muss für jede nachfolgende Anforderung einige Autorisierungsheader festlegen, nachdem sich der Benutzer angemeldet hat.
So setzen Sie Header für eine bestimmte Anforderung:
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
Es wäre jedoch nicht möglich, Anforderungsheader für jede Anforderung auf diese Weise manuell festzulegen.
Wie setze ich die Header, die festgelegt wurden, nachdem sich der Benutzer angemeldet hat, und entferne diese Header auch beim Abmelden?
Antworten:
Zur Beantwortung Ihrer Frage könnten Sie einen Dienst bereitstellen, der das ursprüngliche
Http
Objekt von Angular umschließt. So etwas wie unten beschrieben.Und anstatt das
Http
Objekt zu injizieren, können Sie dieses (HttpClient
) injizieren .Ich denke auch, dass etwas mit mehreren Anbietern für die
Http
Klasse getan werden könnte, indem Sie Ihre eigene Klasse bereitstellen, die dieHttp
eine erweitert ... Siehe diesen Link: http : //blog. Thoughtram.io/angular2/2015/11/23/multi-providers -in-angle-2.html .quelle
Bearer ${token}
, / \ "/ g, '')])HTTP Abfangjäger sind jetzt verfügbar über die neuen
HttpClient
aus@angular/common/http
, als von Angular 4.3.x Versionen und darüber hinaus .Es ist jetzt ziemlich einfach, für jede Anfrage einen Header hinzuzufügen:
Es gibt ein Prinzip der Unveränderlichkeit . Aus diesem Grund muss die Anforderung geklont werden, bevor etwas Neues darauf festgelegt wird.
Da das Bearbeiten von Headern eine sehr häufige Aufgabe ist, gibt es tatsächlich eine Verknüpfung dafür (beim Klonen der Anforderung):
const clonedRequest = req.clone({ setHeaders: { Authorization: 'Bearer 123' } });
Nachdem Sie den Interceptor erstellt haben, sollten Sie ihn mit dem
HTTP_INTERCEPTORS
Provide registrieren .quelle
Das Erweitern
BaseRequestOptions
kann in diesem Szenario eine große Hilfe sein. Überprüfen Sie den folgenden Code:Dies sollte in jedem Anruf 'My-Custom-Header' enthalten.
Aktualisieren:
Um den Header jederzeit anstelle des obigen Codes ändern zu können, können Sie auch den folgenden Code verwenden, um einen neuen Header hinzuzufügen:
zu löschen können Sie tun
Es gibt auch eine andere Funktion, mit der Sie den Wert einstellen können:
Die obige Lösung ist im Typoskript-Kontext immer noch nicht vollständig gültig. _defaultHeaders ist geschützt und sollte nicht so verwendet werden. Ich würde die obige Lösung für eine schnelle Lösung empfehlen, aber auf lange Sicht ist es besser, einen eigenen Wrapper um http-Aufrufe zu schreiben, der auch die Authentifizierung übernimmt. Nehmen Sie das folgende Beispiel aus auth0, das besser und sauberer ist.
https://github.com/auth0/angular2-jwt/blob/master/angular2-jwt.ts
Update - Juni 2018 Ich sehe viele Leute, die sich für diese Lösung entscheiden, aber ich würde anders raten. Wenn Sie den Header global anhängen, wird ein Authentifizierungstoken an jeden API-Aufruf gesendet , der von Ihrer App ausgeht. Die API-Aufrufe, die an Plugins von Drittanbietern wie Intercom, Zendesk oder eine andere API gesendet werden, enthalten also auch Ihren Autorisierungsheader. Dies kann zu einer großen Sicherheitslücke führen. Verwenden Sie stattdessen den Interceptor global, prüfen Sie jedoch manuell, ob der ausgehende Anruf auf den API-Endpunkt Ihres Servers gerichtet ist oder nicht, und fügen Sie dann den Auth-Header hinzu.
quelle
_defaultOptions
ist geschützt, kann also nicht aus dem Dienst gerufen werdenIch antworte zwar sehr spät, aber es könnte jemand anderem helfen. Um allen Anforderungen bei
@NgModule
Verwendung Header hinzuzufügen , kann Folgendes ausgeführt werden:(Ich habe dies in Angular 2.0.1 getestet.)
Gehen
@NgModule
Sie nun wie folgt vor:quelle
CustomRequestOptions
selbst wenn @ Inject / @ Injectable verwendet wurde. Die Lösung, die ich erkannte, war zu erweiternRequestOptions
, nichtBaseRequestOptions
. Das BereitstellenBaseRequestOptions
funktioniert nicht, aber durch das ErweiternRequestOptions
funktioniert DI wieder.Authorization
Header bei der Anwendungsinitialisierung nur einmal festgelegt wird.In
Angular 2.1.2
Ich näherte mich dem durch Erweitern des eckigen HTTP:Dann konnte ich in meinen App-Anbietern eine benutzerdefinierte Factory verwenden, um "HTTP" bereitzustellen.
Jetzt muss ich nicht jede HTTP-Methode deklarieren und kann sie
http
in meiner gesamten Anwendung wie gewohnt verwenden.quelle
request()
Methode, die Sie überladen, hat zwei Aufrufsignaturen und dieoptions
Eigenschaft wird nur verwendet, wennurl
sie als Zeichenfolge angegeben wird. Wennurl
es sich um eine Instanz von handeltRequest
, wird dieoptions
Eigenschaft einfach ignoriert. Dies kann zu schwer zu fassenden Fehlern führen. Bitte sehen Sie meine Antwort für weitere Details.Erstellen Sie eine benutzerdefinierte HTTP-Klasse, indem Sie den Angular 2-
Http
Anbieter erweitern, und überschreiben Sie einfach die Methodeconstructor
undrequest
in Ihrer benutzerdefinierten HTTP-Klasse. Im folgenden Beispiel wirdAuthorization
jeder http-Anforderung ein Header hinzugefügt.Konfigurieren Sie dann Ihr Hauptmenü so
app.module.ts
, dass es dasXHRBackend
alsConnectionBackend
Anbieter und dasRequestOptions
für Ihre benutzerdefinierte HTTP-Klasse bereitstellt :Danach können Sie Ihren benutzerdefinierten http-Anbieter in Ihren Diensten verwenden. Zum Beispiel:
Hier ist eine umfassende Anleitung - http://adonespitogo.com/articles/angular-2-extending-http-provider/
quelle
setRouter(router)
. Oder Sie können eine andere Klasse erstellen und dort Ihre benutzerdefinierte http-Klasse anstelle des Gegenteils einfügen.Für Angular 5 und höher können wir HttpInterceptor zum Verallgemeinern der Anforderungs- und Antwortoperationen verwenden. Dies hilft uns, Doppelarbeit zu vermeiden:
1) Gemeinsame Überschriften
2) Angeben des Antworttyps
3) Anfrage abfragen
Wir können diese AuthHttpInterceptor-Klasse als Provider für die HttpInterceptors verwenden:
quelle
Besser spät als nie ... =)
Sie können das Konzept der erweiterten Option
BaseRequestOptions
(von hier aus https://angular.io/docs/ts/latest/guide/server-communication.html#!#override-default-request-options ) übernehmen und die Header "on the fly" aktualisieren "(nicht nur im Konstruktor). Sie können die Überschreibung der Getter / Setter-Eigenschaft "headers" wie folgt verwenden:quelle
So habe ich das Token bei jeder Anfrage gesetzt.
Und registrieren Sie sich in app.module.ts
quelle
Hier ist eine verbesserte Version der akzeptierten Antwort, die für Angular2 final aktualisiert wurde:
Natürlich sollte es für Methoden wie
delete
undput
bei Bedarf erweitert werden (ich brauche sie zu diesem Zeitpunkt in meinem Projekt noch nicht).Der Vorteil ist, dass die
get
/post
/ ... -Methoden weniger doppelten Code enthalten .Beachten Sie, dass ich in meinem Fall Cookies zur Authentifizierung verwende. Ich brauchte den Header für i18n (den
Accept-Language
Header), da viele von unserer API zurückgegebene Werte in die Sprache des Benutzers übersetzt werden. In meiner App enthält der i18n-Dienst die aktuell vom Benutzer ausgewählte Sprache.quelle
Wie wäre es mit einem separaten Service wie folgt?
und wenn Sie dies von einem anderen Ort aus anrufen, verwenden Sie
this.httpClientService.addHeader("Authorization", "Bearer " + this.tok);
und Sie sehen den hinzugefügten Header zB: - Autorisierung wie folgt
quelle
Nach einigen Nachforschungen fand ich den endgültigen und einfachsten Weg, ihn zu erweitern
BaseRequestOptions
.Im Folgenden habe ich versucht, aus irgendeinem Grund aufzugeben:
1. Erweitern Sie
BaseRequestOptions
und fügen Sie dynamische Header hinzuconstructor()
. Es kann nicht funktionieren, wenn ich mich anmelde. Es wird einmal erstellt. Es ist also nicht dynamisch.2. verlängern
Http
. Aus dem gleichen Grund wie oben kann ich keine dynamischen Header hinzufügenconstructor()
. Und wenn ich dierequest(..)
Methode neu schreibe und Header wie folgt setze:Sie müssen diese Methode nur überschreiben, aber nicht alle get / post / put-Methoden.
3.Und meine bevorzugte Lösung ist Erweitern
BaseRequestOptions
und Überschreibenmerge()
:Diese
merge()
Funktion wird bei jeder Anfrage aufgerufen.quelle
BaseRequestOptions
. Leider hat dies bei mir nicht funktioniert. irgendwelche möglichen Gründe?AuthRequestOptions
an den Rest der App an? Ich habe versucht, dies in denproviders
Abschnitt aufzunehmen, aber es hat nichts getan.RequestOptions
nicht überschreibenBaseRequestOptions
. angle.io/api/http/BaseRequestOptions{ provide: RequestOptions, useClass: AuthRequestOptions }
Ich antworte zwar sehr spät, aber wenn jemand nach einer einfacheren Lösung sucht.
Wir können angle2-jwt verwenden. angle2-jwt ist nützlich, um automatisch ein JSON-Web-Token (JWT) als Autorisierungsheader anzuhängen, wenn HTTP-Anforderungen von einer Angular 2-App gestellt werden.
Wir können globale Header mit erweiterter Konfigurationsoption festlegen
Und Senden pro Anfrage Token wie
quelle
Ich mag die Idee, Standardoptionen zu überschreiben, dies scheint eine gute Lösung zu sein.
Wenn Sie jedoch die
Http
Klasse erweitern möchten. Lesen Sie dies unbedingt durch!Einige Antworten hier zeigen tatsächlich eine falsche Überladung der
request()
Methode, was zu schwer zu fassenden Fehlern und seltsamem Verhalten führen kann. Ich bin selbst darauf gestoßen.Diese Lösung basiert auf der
request()
Methodenimplementierung in Angular4.2.x
, sollte jedoch zukunftskompatibel sein:Beachten Sie, dass ich die ursprüngliche Klasse auf diese Weise importiere
import { Http as NgHttp } from '@angular/http';
, um Namenskonflikte zu vermeiden.Und hier ist das Beispiel, wie diese überschriebene Klasse im DI-Container registriert wird:
Mit einem solchen Ansatz können Sie die
Http
Klasse normal injizieren , aber Ihre überschriebene Klasse wird stattdessen magisch injiziert. Auf diese Weise können Sie Ihre Lösung einfach integrieren, ohne andere Teile der Anwendung zu ändern (Polymorphismus in Aktion).Fügen Sie einfach
httpProvider
dieproviders
Eigenschaft Ihrer Modul-Metadaten hinzu.quelle
Das einfachste von allen
Erstellen Sie eine
config.ts
DateiDann
service
importieren Sie einfach dieconfig.ts
DateiIch denke, es war das einfachste und sicherste.
quelle
Es gab einige Änderungen für Winkel 2.0.1 und höher:
quelle
Ich kann eine einfachere Lösung auswählen> Fügen Sie den Standardoptionen neue Header hinzu, die von Ihrer API-Get-Funktion (oder einer anderen Funktion) zusammengeführt oder geladen werden.
Natürlich können Sie diese Header in Standardoptionen oder was auch immer in Ihrer Klasse externalisieren. Dies ist in der von Ionic generierten API-API {} von @.jectable () der Exportklasse {}
Es ist sehr schnell und es funktioniert für mich. Ich wollte kein json / ld-Format.
quelle
Sie können
canActive
in Ihren Routen Folgendes verwenden:Entnommen aus: https://auth0.com/blog/angular-2-authentication
quelle