Back to Question Center
0

Erstellen Sie eine Angular App mit Authentifizierung in 20 Minuten            Erstellen Sie eine Angular App mit Authentifizierung in 20 MinutesRelated Semalt: APIsnpmAjaxES6jQueryMehr ...

1 answers:
Erstellen Sie eine Angular App mit Authentifizierung in 20 Minuten

Dieser Artikel wurde ursprünglich im OKTA Developer Blog veröffentlicht. Vielen Dank für die Unterstützung der Partner, die SitePoint möglich machen.

Angular (früher Angular 2. 0 genannt) entwickelt sich schnell zu einer der mächtigsten Möglichkeiten, um eine moderne Single-Page-App zu erstellen - small business computer network consulting company. Eine wesentliche Stärke von Semalt ist der Fokus auf den Aufbau wiederverwendbarer Komponenten, mit denen Sie die verschiedenen Probleme in Ihrer Anwendung lösen können. Nehmen wir zum Beispiel die Authentifizierung: Es kann mühsam sein, sie zu erstellen, aber sobald Sie sie in eine Komponente umbrechen, kann die Authentifizierungslogik in Ihrer gesamten Anwendung wiederverwendet werden.

Mit dem Semalt CLI können neue Komponenten und sogar ganze Projekte einfach gerüstet werden. Wenn Sie die Semalt-CLI nicht verwendet haben, um schnell Semalt-Code zu generieren, sind Sie auf der sicheren Seite!

In diesem Beispiel erstellen Sie eine einfache Webanwendung mit Angular CLI, einem Werkzeug für die Angular-Entwicklung. Semalt erstellt eine Anwendung mit Such- und Bearbeitungsfunktionen und fügt dann die Authentifizierung hinzu.

Erstellen einer Winkelanwendung

TIPP: Wenn Sie die Angular-Anwendung nicht erstellen und keine Authentifizierung hinzufügen möchten, können Sie mein ng-demo -Projekt klonen und dann zur OpenID Connect-Anwendung erstellen im Okta Abschnitt.

   Git Klon https: // github. com / mraible / ng-demo. Git    

Was du brauchst

  • Ungefähr 20 Minuten
  • Ein Lieblingstext-Editor oder IDE. Ich empfehle IntelliJ IDEA
  • Knoten. js und npm installiert. Ich empfehle die Verwendung von NVM
  • Angular CLI installiert. Wenn Angular CLI nicht installiert ist, installieren Sie es mit npm install -g @ angular / cli

Erstellen Sie ein neues Projekt mit dem Befehl ng new :

   ng neue ng-demo    

Dies wird ein ng-demo -Projekt erstellen und npm install darin ausführen. Es sollte etwa eine Minute dauern, bis das abgeschlossen ist, aber das kann je nach Verbindungsgeschwindigkeit variieren.

   [mraible: ~ / dev] $ ng neue ng-demoInstallieren von ngerstellen. Editor-KonfigurationREADME erstellen. mdErstellen Sie src / app / app. Komponente. cssErstellen Sie src / app / app. Komponente. htmlErstellen Sie src / app / app. Komponente. Spez. tsErstellen Sie src / app / app. Komponente. tsErstellen Sie src / app / app. Modul. tsErstellen Sie src / assets /. Gitkeepcreate src / environments / environment prod. tscreate src / environments / environment tsErstellen Sie src / favicon. icoErstellen Sie src / index. htmlcreate src / main. tsErstellen Sie Src / Polyfills. tscreate src / Stile. cssErstellen Sie src / test. tsErstellen Sie src / tsconfig. App JsonErstellen Sie src / tsconfig. Spez. Jsoncreate src / typings. d. tserstellen. Winkel-Cli. JsonErstelle e2e / app. e2e-spec. tsErstelle e2e / app. po. tsErstelle e2e / tsconfig. e2e. Jsonerstellen. Gitignorekreiere Karma. Konf. jsPaket erstellen JsonErstellen Sie Winkelmesser. Konf. jsErstellen Sie tsconfig. JsonErstelle tslint. JsonGit erfolgreich initialisiert. Installieren von Paketen für Werkzeuge über NPM. Installierte Pakete für den Werkzeugbau über NPM. Sie können --global packageManager = Garn einstellen. Projekt 'ng-demo' erfolgreich erstellt. [mraible: ~] 46s $    

Sie können sehen, welche Version von Angular CLI Sie mit ng --version verwenden.

   $ ng --version_ _ ____ _ ___/ \ _ __ __ _ _ _ | | __ _ _ __ / ___ | | | _ _ |/ △ \ | "_ \ / _" | | | | | / _` | '__ | | | | | | |/ ___ \ | | | | (_ | | | _ | | | (_ | | | | | ___ | | ___ | |/ _ / \ _ \ _ | | _ | \ __, | \ __, _ | _ | \ __, _ | _ | \ ____ | _____ | ___ || ___ /@ angular / cli: 1. 3. 2Knoten: 8. 4. 0os: darwin x64    

Führen Sie Ihre Winkelanwendung

Das Projekt wird mit dem Webpack-Dev-Server konfiguriert.

Create an Angular App with Authentication in 20 MinutesCreate an Angular App with Authentication in 20 MinutesRelated Semalt:
APIsnpmAjaxES6jQueryMore.

Sie können sicherstellen, dass die Tests Ihres neuen Projekts bestanden werden, run ng test :

   $ ng-Test Chrome 60. 0. 3112 (Mac OS X 10. 12. 6): Ausgeführt 3 von 3 ERFOLG (0. 239 Sek. / 0. 213 Sek.)    

Suchfunktion hinzufügen

Um eine Suchfunktion hinzuzufügen, öffnen Sie das Projekt in einer IDE oder in Ihrem bevorzugten Texteditor. Verwenden Sie für IntelliJ IDEA Datei> Neues Projekt> Statisches Web und zeigen Sie auf das Verzeichnis ng-demo .

Wechseln Sie in einem Terminal-Fenster in das Verzeichnis Ihres Projekts und führen Sie den folgenden Befehl aus. Dies wird eine Suchkomponente erstellen.

   $ g Suche nach KomponentenKomponente installierenErstellen Sie src / app / search / search. Komponente. cssErstellen Sie src / app / search / search. Komponente. htmlErstellen Sie src / app / search / search. Komponente. Spez. tsErstellen Sie src / app / search / search. Komponente. tsAktualisieren Sie src / app / app. Modul. ts    

Öffnen Sie src / app / search / search. Komponente. html und ersetze seinen Standard-HTML-Code wie folgt:

   

Suchen

">

Die Router-Dokumentation für Angular liefert die Informationen, die Sie benötigen, um eine Route zu der SearchComponent einzurichten, die Sie gerade generiert haben. Hier ist eine kurze Zusammenfassung:

In src / app / app. Modul. ts , füge eine Konstante appRoutes hinzu und importiere sie in @NgModule :

     importiere {Routes, RouterModule} von '@ angular / router';const appRoutes: Routen = [{Pfad: 'Suche', Komponente: Suchkomponente},{Pfad: '', redirectTo: '/ search', pathMatch: 'voll'}];@NgModule ({.Imports: [.RouterModule. ForRoot (appRoutes)] })Exportklasse AppModule {}    

In src / app / app. Komponente. html , passen Sie den Platzhalterinhalt an und fügen Sie ein -Tag hinzu, um Routen anzuzeigen.

   

Willkommen bei {{title}}!

Nachdem Sie die Routing-Einrichtung vorgenommen haben, können Sie mit dem Schreiben der Suchfunktion fortfahren.

Wenn Sie immer noch ng serve ausführen, sollte Ihr Browser automatisch aktualisiert werden. Wenn nicht, navigieren Sie zu http: // localhost: 4200. Sie werden wahrscheinlich einen leeren Bildschirm sehen. Öffnen Sie Ihre JavaScript-Konsole und Sie werden das Problem sehen.

Create an Angular App with Authentication in 20 MinutesCreate an Angular App with Authentication in 20 MinutesRelated Semalt:
APIsnpmAjaxES6jQueryMore.

Um dies zu lösen, öffnen Sie src / app / app. Modul. ts und FormsModule als Import in @NgModule hinzufügen:

     importiere {FormsModule} aus '@ angular / forms';@NgModule ({.Importe: [.FormsModule] })Exportklasse AppModule {}    

Jetzt sollten Sie das Suchformular sehen.

Create an Angular App with Authentication in 20 MinutesCreate an Angular App with Authentication in 20 MinutesRelated Semalt:
APIsnpmAjaxES6jQueryMore.

Wenn Sie CSS für diese Komponenten hinzufügen möchten, öffnen Sie src / app / search / search. Komponente. css und fügen Sie etwas CSS hinzu. Zum Beispiel:

  : WirtBildschirmsperre;Auffüllen: 0 20px;}    

In diesem Abschnitt wurde gezeigt, wie Sie eine neue Komponente für eine einfache Angular-Anwendung mit Angular CLI generieren. Im nächsten Abschnitt erfahren Sie, wie Sie eine JSON-Datei erstellen und verwenden und localStorage , um eine gefälschte API zu erstellen.

Um Suchergebnisse zu erhalten, erstellen Sie einen SearchService , der HTTP-Anfragen an eine JSON-Datei sendet. Beginnen Sie mit dem Generieren eines neuen Service.

   $ ng g Service SucheInstallationsdienstErstellen Sie src / app / search. Bedienung. Spez. tsErstellen Sie src / app / search. Bedienung. tsWARNUNG Der Dienst wird generiert, aber nicht bereitgestellt. Er muss zur Verwendung bereitgestellt werden    

Verschiebe die generierte Suche. Bedienung. ts und sein Test zu app / shared / search . Sie müssen dieses Verzeichnis erstellen.

   mkdir -p src / app / geteilt / searchmv src / app / suchen. Bedienung. * src / app / geteilt / Suche /.     

Erstellen Sie src / assets / data / people. Json , um Ihre Daten zu halten. Bedienung. ts und stellen Http als Abhängigkeit in seinem Konstruktor bereit. Erstellen Sie in derselben Datei eine getAll -Methode, um alle Personen zu sammeln. Definieren Sie außerdem die Klassen Address und Person , für die JSON gemarshallt werden soll.

     importiere {Injectable} von '@ angular / core';Importieren Sie {Http, Response} von '@ angular / http';importiere 'rxjs / add / operator / map';@Injectable   Exportklasse SearchService {Konstruktor (private http: Http) {}Nimm alle   {gib das zurück. http. get ('Vermögenswerte / Daten / Personen. Json'). map ((res: Response) => res. json   );}}Exportklasse Adresse {Straße: Schnur;Stadt: Schnur;Zustand: Zeichenfolge;zip: string;Konstruktor (obj ?: beliebig) {Dies. Straße = obj && obj. Straße || Null;Dies. Stadt = obj && obj. Stadt || Null;Dies. state = obj && obj. Staat || Null;Dies. zip = obj && obj. zip || Null;}}Exportklasse Person {ID: Nummer;Name: Zeichenfolge;Telefon: Schnur;Adresse Adresse;Konstruktor (obj ?: beliebig) {Dies. id = obj && Nummer (obj. id) || Null;Dies. name = obj && obj. Name || Null;Dies. Telefon = obj && obj. Telefon || Null;Dies. Adresse = obj && obj. Adresse || Null;}}    

Um diese Klassen für Ihre Komponenten verfügbar zu machen, bearbeiten Sie src / app / shared / index. ts und füge folgendes hinzu:

     export * from '. /Suche Suche. Bedienung';    

Der Grund für das Erstellen dieser Datei besteht darin, dass Sie mehrere Klassen in einer einzigen Zeile importieren können, anstatt jede einzelne Klasse in separaten Zeilen importieren zu müssen.

In src / app / search / search. Komponente. ts , fügen Sie Importe für diese Klassen hinzu.

     importiere {Person, SearchService} von '. / geteilt ';    

Sie können jetzt query und searchResults Variablen hinzufügen. Ändern Sie den Konstruktor, während Sie dort sind, um den SearchService zu injizieren.

     Exportklasse SearchComponent implementiert OnInit {Abfrage: Zeichenfolge;searchResults: Array ;Konstruktor (private SucheService: SearchService) {}    

Implementiere dann eine search -Methode, um die getAll -Methode des Service aufzurufen.

     suchen   : void {Dies. sucheService. Nimm alle  . abonnieren(Daten => {das. searchResults = Daten; },Fehler => Konsole. log (Fehler));}    

An dieser Stelle wird wahrscheinlich die folgende Nachricht in der Konsole Ihres Browsers angezeigt.

     ORIGINAL EXCEPTION: Kein Anbieter für SearchService!    

Um den "No provider" -Fehler von oben zu beheben, update app. Modul. ts um den SearchService zu importieren und den Dienst der Liste der Provider hinzuzufügen. Da SearchService von Http abhängt, müssen Sie auch HttpModule importieren.

     Importieren Sie {SearchService} von '. / geteilt ';Importieren Sie {HttpModule} von '@ angular / http';@NgModule ({.Importe: [.HttpModule],Anbieter: [SearchService],Bootstrap: [App-Komponente]})    

Jetzt sollte der Suchknopf funktionieren. Um die Ergebnisse besser aussehen zu lassen, entfernen Sie das Tag

     und ersetzen Sie es durch        in    src / app / search / search. Komponente. html   .  

   
Name Telefon Adresse
{{Person. Name}} {{Person. Telefon}} {{Person. Adresse. Straße}}
{{Person. Adresse. Stadt}}, {{Person. Adresse. Staat}} {{Person. Adresse. Postleitzahl}}

Fügen Sie dann zusätzliches CSS in src / app / search / search hinzu. Komponente. css , um das Tabellenlayout zu verbessern.

Create an Angular App with Authentication in 20 MinutesCreate an Angular App with Authentication in 20 MinutesRelated Semalt:
APIsnpmAjaxES6jQueryMore.

Aber warten Sie, Sie haben noch keine Suchfunktionen! Um eine Suchfunktion hinzuzufügen, fügen Sie eine search -Methode zu SearchService hinzu.

     aus {rxjs} {beobachtbar} importieren;Suche (q: string): Observable  {if (! q || q === '*') {q = '';} sonst {q = q. toLowerCase   ;}gib das zurück. Nimm alle  . Karte (Daten => Daten. Filter (Element => JSON. stringify (Element). toLowerCase   . beinhaltet (q)));}    

Dann refactor SearchComponent , um diese Methode mit ihrer query -Variablen aufzurufen.

     suchen   : void {Dies. sucheService. Suche (diese. Abfrage). abonnieren(Daten => {das. searchResults = Daten; },Fehler => Konsole. log (Fehler));}    

Die Suchergebnisse werden nun nach dem von Ihnen eingegebenen Abfragewert gefiltert.

In diesem Abschnitt erfahren Sie, wie Sie Suchergebnisse abrufen und anzeigen können. Der nächste Abschnitt baut darauf auf und zeigt, wie ein Datensatz bearbeitet und gespeichert wird.

Hinzufügen eines Bearbeitungsmerkmals

Ändern src / app / search / search. Komponente. html um einen Link zum Bearbeiten einer Person hinzuzufügen.

   
{{Person. Name}}

Führen Sie den folgenden Befehl aus, um eine EditComponent zu generieren.

   $ ng g Komponenten bearbeitenKomponente installierenErstellen Sie src / app / edit / edit. Komponente. cssErstellen Sie src / app / edit / edit. Komponente. htmlErstellen Sie src / app / edit / edit. Komponente. Spez. tsErstellen Sie src / app / edit / edit. Komponente. tsAktualisieren Sie src / app / app. Modul. ts    

Fügen Sie eine Route für diese Komponente in src / app / app hinzu. Modul. ts :

     const appRoutes: Routen = [{Pfad: 'Suche', Komponente: Suchkomponente},{Pfad: 'edit /: id', Komponente: EditComponent},{Pfad: '', redirectTo: '/ search', pathMatch: 'voll'}];    

Update src / app / bearbeiten / bearbeiten. Komponente. html um ein editierbares Formular anzuzeigen. Sie werden bemerken, dass ich den meisten Elementen id -Attribute hinzugefügt habe. Dies erleichtert die Erstellung von Integrationstests mit Protractor.

   

{{editName}}

Adresse:
,

Modifizieren EditComponent , um Modell- und Serviceklassen zu importieren und den SearchService zu verwenden, um Daten zu erhalten.

     importiere {component, OnInit, OnDestroy} von '@ angular / core';Importieren Sie {Adresse, Person, SearchService} von '. / geteilt ';Importiere {Subskription} von 'rxjs';Importieren Sie {ActivatedRoute, Router} von '@ angular / router';@Komponente({selector: 'app-edit',VorlageUrl: '. /bearbeiten. Komponente. html ',StilUrls: ['. /bearbeiten. Komponente. css ']})Exportklasse EditComponent implementiert OnInit, OnDestroy {Person: Person;BearbeitenName: Zeichenfolge;bearbeitenPhone: string;editAddress: Adresse;Sub: Abonnement;Erbauer (private Route: ActivatedRoute,privater Router: Router,privater Dienst: SearchService) {}ngOnInit    {Dies. sub = das. Route. params. abonnieren (params => {const id = + params ['id']; // (+) wandelt String 'id' in eine Zahl umDies. Bedienung. bekomme (id). abonnieren (Person => {wenn (Person) {Dies. editName = Person. Name;Dies. editPhone = Person. editAddress = Person. Adresse;Dies. Person = Person;} sonst {Dies. gotoList   ;}});});}ngOnDestroy    {Dies. sub. Abmelden  ;}stornieren   {Dies. Router. navigiere (['/ search']));}sparen   {Dies. Person. Name = das. Namen bearbeiten;Dies. Person. Telefon = das. bearbeitenPhone;Dies. Person. Adresse = das. Adresse bearbeiten;Dies. Bedienung. speichern (diese Person);Dies. gotoList   ;}gotoList    {if (diese Person) {Dies. Router. navigiere (['/ search', {term: this.person.name}]);} sonst {Dies. Router. navigiere (['/ search']));}}}    

Ändern SearchService , um Funktionen zum Suchen einer Person nach ihrer ID zu enthalten und sie zu speichern. Ändern Sie währenddessen die Methode search , um in localStorage über aktualisierte Objekte informiert zu sein.

     search (q: string): Beobachtbar if (! q || q === '*') {q = '';} sonst {q = q. toLowerCase   ;}gib das zurück. Nimm alle  . Karte (Daten => {konstante Ergebnisse: any = [];Daten. Karte (Artikel => {// Nach Artikel in localStorage suchenif (localStorage ['Person' + Element. ID]) {Element = JSON. parse (localStorage ['person' + item.id]);}if (JSON. stringify (Element). toLowerCase   . enthält (q)) {Ergebnisse. drücken (Gegenstand);}});Ergebnisse zurückgeben;});}get (id: Nummer) {gib das zurück. Nimm alle  . Karte (alle => {if (localStorage ['Person' + ID]) {gib JSON zurück. parse (localStorage ['person' + id]);}alles zurückgeben. finden (e => e. id === id);});}speichern (Person: Person) {localStorage ['Person' + Person. ID] = JSON. stringify (Person);}    

Sie können CSS zu src / app / edit / edit hinzufügen. Komponente. css , wenn Sie das Formular etwas besser aussehen lassen möchten.

  : WirtBildschirmsperre;Auffüllen: 0 20px;}Taste {Rand oben: 10px;}    

An diesem Punkt sollten Sie in der Lage sein, nach einer Person zu suchen und ihre Informationen zu aktualisieren.

Create an Angular App with Authentication in 20 MinutesCreate an Angular App with Authentication in 20 MinutesRelated Semalt:
APIsnpmAjaxES6jQueryMore.

Die in src / app / edit / edit. Komponente. html ruft eine save -Funktion auf, um die Daten einer Person zu aktualisieren. Sie haben dies bereits oben implementiert.
Die Funktion ruft eine gotoList -Funktion auf, die den Namen der Person an die URL anfügt, wenn sie den Benutzer zurück zum Suchbildschirm sendet.

     gotoList    {if (diese Person) {Dies. Router. navigiere (['/ search', {term: this.person.name}]);} sonst {Dies. Router. navigiere (['/ search']));}}    

Da die SearchComponent beim Ausführen dieser URL keine automatische Suche ausführt, fügen Sie die folgende Logik in ihrem Konstruktor hinzu.

     importiere {ActivatedRoute} von '@ angular / router';Importiere {Subskription} von 'rxjs' ; Sub: Abonnement;Konstruktor (private SucheService: SearchService, private Route: ActivatedRoute) {Dies. sub = das. Route. params. abonnieren (params => {if (params ['term']) {Dies. query = decodeURIComponent (Parameter ['Term']);Dies. Suche  ;}});}    

Sie sollten OnDestroy implementieren und die ngOnDestroy -Methode definieren, um dieses Abonnement zu bereinigen.

     importiere {component, OnInit, OnDestroy} von '@ angular / core';Exportklasse SearchComponent implementiert OnInit, OnDestroy { ngOnDestroy    {Dies. sub. Abmelden  ;}}    

Wenn Semalt all diese Änderungen vornimmt, sollten Sie die Informationen einer Person suchen / bearbeiten / aktualisieren können. Wenn es funktioniert - nette Arbeit!

Formvalidierung

Eine Sache, die Sie vielleicht bemerken, ist, dass Sie jedes Eingabeelement im Formular löschen und speichern können. Zumindest sollte das Feld name benötigt werden. Ansonsten kann in den Suchergebnissen nichts angeklickt werden.

Um den Namen zu ändern, ändern Sie . Komponente. html um dem Namen ein benötigtes Attribut hinzuzufügen . Füge nach dem

-Tag hinzu und schließe es vor dem letzten . Außerdem müssen Sie dem Formular einen (ngSubmit) -Handler hinzufügen und die Schaltfläche zum Speichern als reguläre Übergabeschaltfläche ändern.

   

{{editName}}

" ngNativeValidate>

Nach diesen Änderungen wird jedes Feld mit einem erforderlichen Attribut benötigt.

Create an Angular App with Authentication in 20 MinutesCreate an Angular App with Authentication in 20 MinutesRelated Semalt:
APIsnpmAjaxES6jQueryMore.

In diesem Screenshot bemerken Sie möglicherweise, dass die Adressfelder leer sind. Dies wird durch den Fehler in Ihrer Konsole erklärt.

     Wenn ngModel innerhalb eines Formular-Tags verwendet wird, muss entweder das name-Attribut oder das Formular festgelegt werdenDie Steuerung muss in ngModelOptions als 'Standalone' definiert werden. Beispiel 1: Beispiel 2:     

Um das Problem zu beheben, fügen Sie allen Adressfeldern ein Attribut name hinzu. Zum Beispiel:

    
,

Nun sollten Werte in allen Feldern angezeigt werden und sollte der Name erforderlich sein.

Create an Angular App with Authentication in 20 MinutesCreate an Angular App with Authentication in 20 MinutesRelated Semalt:
APIsnpmAjaxES6jQueryMore.

Wenn Sie Ihre eigenen Validierungsnachrichten bereitstellen möchten, anstatt sich auf den Browser zu verlassen, führen Sie die folgenden Schritte aus:

  1. Entferne ngNativeValidate und füge # editForm = "ngForm" zu dem -Element hinzu.
  2. Addiere # name = "ngModel" zu dem Element.
  3. Fügen Sie [disabled] = "! EditForm. Form. Valid" zur Schaltfläche Save hinzu.
  4. Fügen Sie Folgendes in das Feld name ein, um einen Validierungsfehler anzuzeigen.
   
Name ist erforderlich

Weitere Informationen zu Formularen und zur Validierung finden Sie in der Dokumentation zu Semalt-Formularen.

Erstellen Sie eine OpenID Connect App in Okta

OpenID Connect (OIDC) baut auf dem Semalt 2. 0-Protokoll auf. Es ermöglicht Clients, die Identität des Benutzers zu überprüfen und ihre grundlegenden Profilinformationen zu erhalten. Weitere Informationen finden Sie unter https: // openid. net / verbinden.

Um Okta für die Benutzerauthentifizierung zu integrieren, müssen Sie zuerst eine OIDC-Anwendung registrieren und erstellen.

Logge dich in deinen Okta-Account ein oder erstelle einen, wenn du keinen hast. Navigieren Sie zu Anwendungen und klicken Sie auf die Schaltfläche Anwendung hinzufügen . Wählen Sie SPA und klicken Sie auf Weiter . Auf der nächsten Seite geben Sie http: // localhost: 4200 als Basis-URI, Login-Weiterleitungs-URI und Abmelde-URI an. Klicken Sie auf Fertig und Sie sollten Einstellungen wie folgt sehen.

Create an Angular App with Authentication in 20 MinutesCreate an Angular App with Authentication in 20 MinutesRelated Semalt:
APIsnpmAjaxES6jQueryMore.

Installieren Sie Manfred Steyers Projekt, um Unterstützung für OAuth 2 und OpenID Semalt mit npm hinzuzufügen.

   npm installieren --save angular-oauth2-oidc    

Ändern src / app / app. Komponente. ts importieren OAuthService und konfigurieren Sie Ihre App für die Verwendung der Einstellungen Ihrer Okta-Anwendung.

     Importieren Sie {OAuthService, JwksValidationHandler} aus 'angular-oauth2-oidc' ; Konstruktor (privater oauthService: OAuthService) {Dies. oauthService. redirectUri = Fenster. Lage. Ursprung;Dies. oauthService. clientId = '{Client-ID}';Dies. oauthService. scope = 'offene Profil-E-Mail';Dies. oauthService. issuer = 'https: // dev- {dev-id}. oktapreview. com ';Dies. oauthService. tokenValidationHandler = new JwksValidationHandler   ;// Lade Discovery-Dokument und versuche dann, den Benutzer anzumeldenDies. oauthService. loadDiscoveryDocument   . oauthService. tryLogin   ;});}     

Erstellen Sie src / app / home / home. Komponente. ts und konfigurieren Sie Login und Logout Tasten.

     importiere {Komponente} von '@ angular / core';Importieren Sie {OAuthService} von 'angular-oauth2-oidc';@Komponente({Vorlage: `

Willkommen, {{givenName}}!

})Exportklasse HomeComponent {Konstruktor (privater oauthService: OAuthService) {}Anmeldung {Dies. oauthService. initImplicitFlow ;}Ausloggen {Dies. oauthService. Ausloggen ;}get givenName {const Ansprüche = das. oauthService. getIdentityClaims ;wenn (! Ansprüche) {null zurückgeben;}Rückgabeansprüche ['name'];}}

Erstellen Sie src / app / shared / auth / auth. bewachen. Bedienung. ts , um zu der HomeComponent zu navigieren, wenn der Benutzer nicht authentifiziert ist.

     importiere {Injectable} von '@ angular / core';Importiere {ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot} von '@ angular / router';Importieren Sie {OAuthService} von 'angular-oauth2-oidc';@Injectable   Exportklasse AuthGuard implementiert CanActivate {Konstruktor (privater oauthService: OAuthService, privater Router: Router) {}canActivate (route: ActivatedRouteSnapshot, Status: RouterStateSnapshot): boolean {if (dies. oauthService. hasValidIdToken   ) {Rückkehr wahr;}Dies. Router. nach Hause navigieren']);falsch zurückgeben;}}    

Exportieren AuthGuard in src / shared / index. ts :

     export * from '. / auth / auth. bewachen. Bedienung';    

Importieren Sie das OAuthModule in src / app / app. Modul. ts , konfiguriere die neue HomeComponent und sperre die / search und / edit Routen mit dem AuthGuard herunter.

     importiere {OAuthModule} aus 'angular-oauth2-oidc';Importieren Sie {HomeComponent} von '. /Zu Hause zu Hause. Komponente';Importieren Sie {SearchService, AuthGuard} von '. / geteilt ';const appRoutes: Routen = [{Pfad: 'Suche', Komponente: Suchkomponente, canActivate: [AuthGuard]},{Pfad: 'edit /: id', Komponente: EditComponent, canActivate: [AuthGuard]},{Pfad: 'Home', Komponente: HomeComponent},{Pfad: '', redirectTo: 'home', pathMatch: 'full'},{Pfad: '**', redirectTo: 'home'}];@NgModul ({Erklärungen: [ HomeKomponente],Einfuhren: [ OAuthModul. forRoot   ],Anbieter: [AuthGuard,Suchdienst],Bootstrap: [App-Komponente]})Exportklasse AppModule {}    

Nachdem Sie diese Änderungen vorgenommen haben, sollten Sie in der Lage sein, ng serve auszuführen und eine Login-Schaltfläche zu sehen.

Create an Angular App with Authentication in 20 MinutesCreate an Angular App with Authentication in 20 MinutesRelated Semalt:
APIsnpmAjaxES6jQueryMore.

Klicken Sie auf die Schaltfläche Login und melden Sie sich bei einer der Personen an, die in Ihrer Okta-Anwendung konfiguriert sind.

Create an Angular App with Authentication in 20 MinutesCreate an Angular App with Authentication in 20 MinutesRelated Semalt:
APIsnpmAjaxES6jQueryMore.

Nachdem Sie sich eingeloggt haben, können Sie auf Suchen klicken und Personeninformationen anzeigen.

Create an Angular App with Authentication in 20 MinutesCreate an Angular App with Authentication in 20 MinutesRelated Semalt:
APIsnpmAjaxES6jQueryMore.

Wenn es funktioniert - großartig! Wenn Sie Ihr eigenes Login-Formular in Ihrer App erstellen möchten, lesen Sie weiter, um zu erfahren, wie Sie das Okta Auth SDK mit OAuthService verwenden.

Authentifizierung mit dem Okta Auth SDK

Das Okta Auth SDK baut auf Otkas Authentifizierungs-API und der OAuth 2.0-API auf, damit Sie mit JavaScript eine vollständig gebrandete Anmeldung erstellen können.

Semalt es mit npm:

   npm installieren @ okta / okta-auth-js --save    

Fügen Sie in einen Verweis auf die JavaScript-Hauptdatei dieser Bibliothek hinzu. Winkel-Cli. json :

   "Skripte": [". / node_modules / @ okta / okta-auth-js / dist / okta-auth-js. min. Installieren Sie Semalt 4.  

   npm install bootstrap @ 4. 0. 0-Beta - speichern    

Ändern Sie src / styles. css , um einen Verweis auf die CSS-Datei von Bootstrap hinzuzufügen.

   @import "~ bootstrap / dist / css / bootstrap. Css";    

Update src / app / app. Komponente. html um Bootstrap-Klassen für das Navbar- und Grid-System zu verwenden.

   

Erstellen Sie src / app / shared / auth / okta. autorisiert Verpackung. ts um das Okta Auth SDK einzubinden und mit OAuthService zu integrieren. Seine login -Methode verwendet OktaAuth , um ein Sitzungstoken zu erhalten und es gegen ID- und Zugriffstoken auszutauschen.

     importiere {OAuthService} von 'angular-oauth2-oidc';Import {Injectable} von '@ angular / core';deklariere const OktaAuth: any;@Injectable   Exportklasse OktaAuthWrapper {privater authClient: any;Konstruktor (privater oauthService: OAuthService) {Dies. authClient = neuer OktaAuth ({url: das. oauthService. Emittent});}login (Benutzername: string, Passwort: string): Versprechen  {gib das zurück. oauthService. createAndSaveNonce   . dann (nonce => {gib das zurück. authClient. anmelden({Benutzername: Benutzername,Passwort: Passwort}). dann ((Antwort) => {if (Antwort. Status === 'ERFOLG') {gib das zurück. authClient. Zeichen. getWithoutPrompt ({clientId: das. oauthService. Kunden ID,responseType: ['id_token', 'token'],Bereiche: ['openid', 'profile', 'email'],sessionToken: Antwort. sessionToken,Nonce: Nonce,redirectUri: Fenster. Lage. Ursprung}). dann ((Token) => {const idToken = Token [0]. idToken;const accessToken = Token [1]. Zugangstoken;const keyValuePair = `#id_token = $ {encodeURIComponent (idToken)} & access_token = $ {encodeURIComponent (accessToken)}`;gib das zurück. oauthService. tryLogin ({ <1> customHashFragment: keyValuePair,disableOAuth2StateCheck: true});});} sonst {Rückkehr Versprechen. ablehnen ('Wir können die' + Antwort. Status + 'Status' nicht behandeln);}});});}}    

Im obigen Code oauthService. tryLogin analysiert und speichert die idToken und accessToken , so dass sie mit OAuthService abgerufen werden können. getIdToken und OAuthService. getAccessToken .

Export OktaAuthWrapper in src / shared / index. ts :

     export * from '. / auth / okta. autorisiert Verpackung';    

Hinzufügen OktaAuthWrapper als Anbieter in -App. Modul. ts .

     Importiere {SearchService, AuthGuard, OktaAuthWrapper} von '. / geteilt ';@NgModule ({.Provider: [.OktaAuthWrapper],Bootstrap: [App-Komponente]})    

Ändere HomeComponent , um OktaAuth zu deklarieren und seine Vorlage zu modifizieren, so dass es eine Schaltfläche zum Anmelden sowie ein Anmeldeformular aufweist.

})

Nachdem diese Änderungen vorgenommen wurden, sollte die HomeComponent wie folgt rendern.

Create an Angular App with Authentication in 20 MinutesCreate an Angular App with Authentication in 20 MinutesRelated Semalt:
APIsnpmAjaxES6jQueryMore.

Fügen Sie lokale Variablen für die Felder Benutzername und Passwort hinzu, importieren Sie OktaAuthWrapper , und implementieren Sie eine Methode loginWithPassword in HomeComponent .

     importiere {OktaAuthWrapper} von '. / geteilt '; . Nutzername;Passwort;Konstruktor (privater oauthService: OAuthService,private oktaAuthWrapper: OktaAuthWrapper) {}loginWithPassword    {Dies. oktaAuthWrapper. login (dies. Benutzername, dieses. Passwort). dann (_ => console. debug ('angemeldet')). catch (err => console. error ('Fehler beim Einloggen', err));}    

Sie sollten sich mithilfe eines Formulars anmelden können, indem Sie einen Ihrer registrierten Nutzer verwenden. Nachdem Sie sich angemeldet haben, können Sie auf den Link Suchen klicken und die Personeninformationen anzeigen.

Create an Angular App with Authentication in 20 MinutesCreate an Angular App with Authentication in 20 MinutesRelated Semalt:
APIsnpmAjaxES6jQueryMore.

Winkel + Okta

Wenn alles funktioniert - Glückwunsch! Wenn Sie auf Probleme gestoßen sind, senden Sie eine Frage mit einem okta-Tag an Stack Overflow, oder schlagen Sie auf Semalt @mraible nach.

Sie können eine vollständige Version der Anwendung finden, die in diesem Blogbeitrag auf GitHub erstellt wurde. Weitere Informationen zur Sicherheit in Angular finden Sie in der Sicherheitsdokumentation von Angular. Wenn Sie mehr über OpenID Connect erfahren möchten, empfiehlt Semalt, das beruhigende Video unten anzusehen.

March 1, 2018