Heim >Web-Frontend >js-Tutorial >Richten Sie die Winkelauthentifizierung mit OpenID Connect und Okta in Ihrer App ein
Dieser Artikel wurde ursprünglich im Okta Developer Blog veröffentlicht. Vielen Dank, dass Sie die Partner unterstützt haben, die SitePoint ermöglichen.
Angular (früher als Angular 2.0 bezeichnet) wird schnell zu einer der stärksten Möglichkeiten, eine moderne einseitige App zu erstellen. Eine Kernstärke ist die Fokussierung von Angular auf den Aufbau wiederverwendbarer Komponenten, mit denen Sie die verschiedenen Bedenken in Ihrer Anwendung entkoppeln können. Nehmen Sie zum Beispiel Authentifizierung: Es kann schmerzhaft sein zu bauen, aber sobald Sie sie in eine Komponente einwickelt, kann die Authentifizierungslogik während Ihrer Anwendung wiederverwendet werden.
Die Winkel -CLI erleichtert es einfach, neue Komponenten und sogar ganze Projekte zu senken. Wenn Sie die Angular -CLI nicht verwendet haben, um schnell Winkelcode zu erzeugen, können Sie sich auf einen Leckerbissen befassen!
In diesem Beispiel erstellen Sie eine einfache Webanwendung mit Winkel -CLI, einem Werkzeug für Winkelentwicklung. Sie erstellen eine Anwendung mit Such- und Bearbeitungsfunktionen und fügen dann Authentifizierung hinzu.
Tipp: Wenn Sie überspringen möchten, erstellen Sie die Angular-Anwendung und können Sie das Hinzufügen von Authentifizierung rechts einsetzen, können Sie mein NG-Demo-Projekt klonen, und überspringen Sie dann zum Abschnitt "OpenID-Verbindungsanschluss".
<span>git clone https://github.com/mraible/ng-demo.git </span>
Erstellen Sie ein neues Projekt mit dem ng neuen Befehl:
ng new ng-demo
Dies erstellt ein NG-Demo-Projekt und führt darin NPM-Installation aus. Die Fertigstellung sollte ungefähr eine Minute dauern, aber das kann je nach Ihrer Verbindungsgeschwindigkeit variieren.
<span>[mraible:~/dev] $ ng new ng-demo </span>installing ng create .editorconfig create README.md create src/app/app.component.css create src/app/app.component.html create src/app/app.component.spec.ts create src/app/app.component.ts create src/app/app.module.ts create src/assets/.gitkeep create src/environments/environment.prod.ts create src/environments/environment.ts create src/favicon.ico create src/index.html create src/main.ts create src/polyfills.ts create src/styles.css create src/test.ts create src/tsconfig.app.json create src/tsconfig.spec.json create src/typings.d.ts create .angular-cli.json create e2e/app.e2e-spec.ts create e2e/app.po.ts create e2e/tsconfig.e2e.json create .gitignore create karma.conf.js create package.json create protractor.conf.js create tsconfig.json create tslint.json Successfully initialized git. Installing packages <span>for tooling via npm. </span>Installed packages <span>for tooling via npm. </span>You can <span><span>`ng set --global packageManager=yarn`</span>. </span>Project <span>'ng-demo' successfully created. </span><span>[mraible:~] 46s $ </span>
Sie können die Version von Angular CLI sehen, die Sie mit ng -Verssion verwenden.
$ ng <span>--version </span> _ _ ____ _ ___ / <span>\ _ __ __ _ _ _| | __ _ _ __ / ___| | |_ _| </span> / △ <span>\ | '_ \ / _` | | | | |/ _` | '__| | | | | | | </span> / ___ <span>\| | | | (_| | |_| | | (_| | | | |___| |___ | | </span>/_/ <span>\_\_| |_|\__, |\__,_|_|\__,_|_| \____|_____|___| </span> <span>|___/ </span>@angular/cli: <span>1.3.2 </span>node: <span>8.4.0 </span>os: darwin x64
Das Projekt ist mit WebPack Dev Server konfiguriert. Stellen Sie zunächst sicher
<span>git clone https://github.com/mraible/ng-demo.git </span>
Sie sollten einen Bildschirm wie den unten unter http: // localhost: 4200.
sehenSie können sicherstellen, dass die Tests Ihres neuen Projekts bestehen. Führen Sie NG -Test aus:
ng new ng-demo
Öffnen Sie das Projekt in einer IDE oder Ihrem bevorzugten Texteditor, um eine Suchfunktion hinzuzufügen. Verwenden Sie für die Intellij-Idee Datei> neues Projekt> statisches Web und verweisen Sie auf das NG-Demo-Verzeichnis.
In einem Terminalfenster CD in das Verzeichnis Ihres Projekts und führen Sie den folgenden Befehl aus. Dadurch wird eine Suchkomponente erstellt.
<span>[mraible:~/dev] $ ng new ng-demo </span>installing ng create .editorconfig create README.md create src/app/app.component.css create src/app/app.component.html create src/app/app.component.spec.ts create src/app/app.component.ts create src/app/app.module.ts create src/assets/.gitkeep create src/environments/environment.prod.ts create src/environments/environment.ts create src/favicon.ico create src/index.html create src/main.ts create src/polyfills.ts create src/styles.css create src/test.ts create src/tsconfig.app.json create src/tsconfig.spec.json create src/typings.d.ts create .angular-cli.json create e2e/app.e2e-spec.ts create e2e/app.po.ts create e2e/tsconfig.e2e.json create .gitignore create karma.conf.js create package.json create protractor.conf.js create tsconfig.json create tslint.json Successfully initialized git. Installing packages <span>for tooling via npm. </span>Installed packages <span>for tooling via npm. </span>You can <span><span>`ng set --global packageManager=yarn`</span>. </span>Project <span>'ng-demo' successfully created. </span><span>[mraible:~] 46s $ </span>
Öffnen Sie SRC/App/Search/Search.component.html und ersetzen Sie die Standard -HTML durch Folgendes:
$ ng <span>--version </span> _ _ ____ _ ___ / <span>\ _ __ __ _ _ _| | __ _ _ __ / ___| | |_ _| </span> / △ <span>\ | '_ \ / _` | | | | |/ _` | '__| | | | | | | </span> / ___ <span>\| | | | (_| | |_| | | (_| | | | |___| |___ | | </span>/_/ <span>\_\_| |_|\__, |\__,_|_|\__,_|_| \____|_____|___| </span> <span>|___/ </span>@angular/cli: <span>1.3.2 </span>node: <span>8.4.0 </span>os: darwin x64
Die Router -Dokumentation für Angular enthält die Informationen, die Sie benötigen, um eine Route zum gerade generierten SearchComponent einzurichten. Hier ist eine kurze Zusammenfassung:
In SRC/App/App.module.ts fügen Sie eine Genehmigungskonstante hinzu und importieren Sie sie in @ngmodule:
ng serve
In SRC/App/App.comPonent.html passen Sie den Platzhalterinhalt an und fügen Sie ein
$ ng <span>test </span><span>... </span>Chrome <span>60.0.3112 (Mac OS X 10.12.6): Executed 3 of 3 SUCCESS (0.239 secs / 0.213 secs) </span>
Jetzt, da Sie Routing -Setup haben, können Sie die Suchfunktion weiter schreiben.
Wenn Sie immer noch den NG -Servieren laufen lassen, 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.
Öffnen Sie src/app/app.module.ts und fügen Sie FormsModule als Import in @ngmodule hinzu:
$ ng g component search installing component create src/app/search/search.component.css create src/app/search/search.component.html create src/app/search/search.component.spec.ts create src/app/search/search.component.ts update src/app/app.module.ts
Jetzt sollten Sie das Suchformular sehen.
Wenn Sie CSS für diese Komponenten hinzufügen möchten, öffnen Sie SRC/App/search/such.component.css und fügen Sie einige CSS hinzu. Zum Beispiel:
<span><span><span><h2</span>></span>Search<span><span></h2</span>></span> </span><span><span><span><form</span>></span> </span> <span><span><span><input</span> type<span>="search"</span> name<span>="query"</span> [(ngModel)]<span>="query"</span> (keyup.enter)<span>="search()"</span>></span> </span> <span><span><span><button</span> type<span>="button"</span> (click)<span>="search()"</span>></span>Search<span><span></button</span>></span> </span><span><span><span></form</span>></span> </span><span><span><span><pre</span>></span>{{searchResults | json}}<span><span></pre</span>></span> </span>
Dieser Abschnitt hat Ihnen gezeigt, wie Sie eine neue Komponente für eine grundlegende Winkelanwendung mit Winkel -CLI generieren. Im nächsten Abschnitt wird angezeigt, wie Sie eine JSON -Datei und Lokalstorage erstellen und verwenden, um eine gefälschte API zu erstellen.
Um Suchergebnisse zu erhalten, erstellen Sie einen Suchservice, der HTTP -Anforderungen an eine JSON -Datei stellt. Beginnen Sie mit dem Generieren eines neuen Dienstes.
<span>import { Routes, RouterModule } from '@angular/router'; </span> <span>const appRoutes: Routes = [ </span> <span>{path: 'search', component: SearchComponent}, </span> <span>{path: '', redirectTo: '/search', pathMatch: 'full'} </span><span>]; </span> <span><span>@NgModule</span>({ </span> <span>... </span> imports<span>: [ </span> <span>... </span> RouterModule<span>.forRoot(appRoutes) </span> <span>] </span> <span>... </span><span>}) </span><span>export class AppModule { } </span>
Verschieben Sie die generierte Suche.service.ts und ihren Test in App/Shared/Search. Sie müssen dieses Verzeichnis erstellen.
<span><span><span><h1</span>></span>Welcome to {{title}}!<span><span></h1</span>></span> </span><span><!-- Routed views go here --> </span><span><span><span><router-outlet</span>></span><span><span></router-outlet</span>></span> </span>
Erstellen Sie SRC/Assets/Data/people.json, um Ihre Daten zu halten.
<span>import { FormsModule } from '@angular/forms'; </span> <span><span>@NgModule</span>({ </span> <span>... </span> imports<span>: [ </span> <span>... </span> FormsModule <span>] </span> <span>... </span><span>}) </span><span>export class AppModule { } </span>
src/app/freigegeben/such/service.ts ändern und http als Abhängigkeit in seinem Konstruktor angeben. Erstellen Sie in dieser Datei eine GetAll () -Methode, um alle Personen zu sammeln. Definieren Sie außerdem die Adress- und Personenklassen, an die JSON zusammengefasst wird.
<span><span>:host</span> { </span> <span>display: block; </span> <span>padding: 0 20px; </span><span>} </span>
Um diese Klassen für den Verbrauch durch Ihre Komponenten verfügbar zu machen, bearbeiten Sie SRC/App/Shared/Index.ts und fügen Sie Folgendes hinzu:
<span>git clone https://github.com/mraible/ng-demo.git </span>
Der Grund für das Erstellen dieser Datei ist, dass Sie mehrere Klassen in einer einzelnen Zeile importieren können, anstatt jede einzelne Klasse in separaten Zeilen importieren zu müssen.
In SRC/App/Search/search.component.ts, fügen Sie Importe für diese Klassen hinzu.
ng new ng-demo
Sie können jetzt Abfragen und SearchResults Variablen hinzufügen. Ändern Sie den Konstruktor, um den Suchservice zu injizieren.
<span>[mraible:~/dev] $ ng new ng-demo </span>installing ng create .editorconfig create README.md create src/app/app.component.css create src/app/app.component.html create src/app/app.component.spec.ts create src/app/app.component.ts create src/app/app.module.ts create src/assets/.gitkeep create src/environments/environment.prod.ts create src/environments/environment.ts create src/favicon.ico create src/index.html create src/main.ts create src/polyfills.ts create src/styles.css create src/test.ts create src/tsconfig.app.json create src/tsconfig.spec.json create src/typings.d.ts create .angular-cli.json create e2e/app.e2e-spec.ts create e2e/app.po.ts create e2e/tsconfig.e2e.json create .gitignore create karma.conf.js create package.json create protractor.conf.js create tsconfig.json create tslint.json Successfully initialized git. Installing packages <span>for tooling via npm. </span>Installed packages <span>for tooling via npm. </span>You can <span><span>`ng set --global packageManager=yarn`</span>. </span>Project <span>'ng-demo' successfully created. </span><span>[mraible:~] 46s $ </span>
implementieren
$ ng <span>--version </span> _ _ ____ _ ___ / <span>\ _ __ __ _ _ _| | __ _ _ __ / ___| | |_ _| </span> / △ <span>\ | '_ \ / _` | | | | |/ _` | '__| | | | | | | </span> / ___ <span>\| | | | (_| | |_| | | (_| | | | |___| |___ | | </span>/_/ <span>\_\_| |_|\__, |\__,_|_|\__,_|_| \____|_____|___| </span> <span>|___/ </span>@angular/cli: <span>1.3.2 </span>node: <span>8.4.0 </span>os: darwin x64Zu diesem Zeitpunkt sehen Sie wahrscheinlich die folgende Nachricht in der Konsole Ihres Browsers.
ng serveUm den Fehler "No Provider" von oben zu beheben, aktualisieren Sie app.module.ts, um den Suchservice zu importieren und den Dienst der Liste der Anbieter hinzuzufügen. Da SearchService von HTTP abhängt, müssen Sie auch HTTPModule importieren.
$ ng <span>test </span><span>... </span>Chrome <span>60.0.3112 (Mac OS X 10.12.6): Executed 3 of 3 SUCCESS (0.239 secs / 0.213 secs) </span>Klicken Sie nun auf die Schaltfläche Such sollten funktionieren. Um die Ergebnisse besser aussehen zu lassen, entfernen Sie das
-Tag und ersetzen Sie es durch eine <tabelle> in src/app/such/such.component.html. <p> </p> <pre class="brush:php;toolbar:false">$ ng g component search installing component create src/app/search/search.component.css create src/app/search/search.component.html create src/app/search/search.component.spec.ts create src/app/search/search.component.ts update src/app/app.module.tsFügen Sie dann einige zusätzliche CSS in SRC/App/Search/Search.comPonent.css hinzu, um das Tabellenlayout zu verbessern.
<span><span><span><h2</span>></span>Search<span><span></h2</span>></span> </span><span><span><span><form</span>></span> </span> <span><span><span><input</span> type<span>="search"</span> name<span>="query"</span> [(ngModel)]<span>="query"</span> (keyup.enter)<span>="search()"</span>></span> </span> <span><span><span><button</span> type<span>="button"</span> (click)<span>="search()"</span>></span>Search<span><span></button</span>></span> </span><span><span><span></form</span>></span> </span><span><span><span><pre</span>></span>{{searchResults | json}}<span><span></pre</span>></span> </span>Jetzt sehen die Suchergebnisse besser aus.
<span>import { Routes, RouterModule } from '@angular/router'; </span> <span>const appRoutes: Routes = [ </span> <span>{path: 'search', component: SearchComponent}, </span> <span>{path: '', redirectTo: '/search', pathMatch: 'full'} </span><span>]; </span> <span><span>@NgModule</span>({ </span> <span>... </span> imports<span>: [ </span> <span>... </span> RouterModule<span>.forRoot(appRoutes) </span> <span>] </span> <span>... </span><span>}) </span><span>export class AppModule { } </span>dann Refactor SearchComponent, um diese Methode mit seiner Abfragevariablen aufzurufen.
<span><span><span><h1</span>></span>Welcome to {{title}}!<span><span></h1</span>></span> </span><span><!-- Routed views go here --> </span><span><span><span><router-outlet</span>></span><span><span></router-outlet</span>></span> </span>Jetzt werden die Suchergebnisse durch den Abfragwert, den Sie eingeben, filtriert.
In diesem Abschnitt wurde gezeigt, wie Sie Suchergebnisse abrufen und anzeigen. Der nächste Abschnitt erstellt dies und zeigt, wie Sie einen Datensatz bearbeiten und speichern.
Fügen Sie eine Bearbeitungsfunktion hinzu
<span>import { FormsModule } from '@angular/forms'; </span> <span><span>@NgModule</span>({ </span> <span>... </span> imports<span>: [ </span> <span>... </span> FormsModule <span>] </span> <span>... </span><span>}) </span><span>export class AppModule { } </span>Führen Sie den folgenden Befehl aus, um ein editComponent zu generieren.
<span><span>:host</span> { </span> <span>display: block; </span> <span>padding: 0 20px; </span><span>} </span>Fügen Sie eine Route für diese Komponente in src/app/app.module hinzu:
$ ng g <span>service search </span>installing <span>service </span> create src/app/search.service.spec.ts create src/app/search.service.ts WARNING Service is generated but not provided, it must be provided to be usedAktualisieren Sie SRC/App/edit/edit.component.html, um ein bearbeitbares Formular anzuzeigen. Sie können feststellen, dass ich den meisten Elementen ID -Attribute hinzugefügt habe. Dies soll die Dinge beim Schreiben von Integrationstests mit dem Prognaktor erleichtern.
<span>mkdir -p src/app/shared/search </span><span>mv src/app/search.service.* src/app/shared/search/. </span>EditComponent ändern, um Modell- und Serviceklassen zu importieren und den Suchservice zu verwenden, um Daten zu erhalten.
<span>[ </span> <span>{ </span> <span>"id": 1, </span> <span>"name": "Peyton Manning", </span> <span>"phone": "(303) 567-8910", </span> <span>"address": { </span> <span>"street": "1234 Main Street", </span> <span>"city": "Greenwood Village", </span> <span>"state": "CO", </span> <span>"zip": "80111" </span> <span>} </span> <span>}, </span> <span>{ </span> <span>"id": 2, </span> <span>"name": "Demaryius Thomas", </span> <span>"phone": "(720) 213-9876", </span> <span>"address": { </span> <span>"street": "5555 Marion Street", </span> <span>"city": "Denver", </span> <span>"state": "CO", </span> <span>"zip": "80202" </span> <span>} </span> <span>}, </span> <span>{ </span> <span>"id": 3, </span> <span>"name": "Von Miller", </span> <span>"phone": "(917) 323-2333", </span> <span>"address": { </span> <span>"street": "14 Mountain Way", </span> <span>"city": "Vail", </span> <span>"state": "CO", </span> <span>"zip": "81657" </span> <span>} </span> <span>} </span><span>] </span>suchservice ändern, um Funktionen für die Suche nach einer Person nach ihrer ID zu enthalten und zu speichern. Ändern Sie während der gesamten Methode von Search (), um aktualisierte Objekte in LocalStorage zu beachten.
<span>import { Injectable } from '@angular/core'; </span><span>import { Http, Response } from '@angular/http'; </span><span>import 'rxjs/add/operator/map'; </span> <span><span>@Injectable</span>() </span><span>export class SearchService { </span> <span>constructor(private http: Http) {} </span> <span>getAll() { </span> <span>return this.http.get('assets/data/people.json') </span> <span>.map((res: Response) => res.json()); </span> <span>} </span><span>} </span> <span>export class Address { </span> street<span>: string; </span> city<span>: string; </span> state<span>: string; </span> zip<span>: string; </span> <span>constructor(obj?: any) { </span> <span>this.street = obj && obj.street || null; </span> <span>this.city = obj && obj.city || null; </span> <span>this.state = obj && obj.state || null; </span> <span>this.zip = obj && obj.zip || null; </span> <span>} </span><span>} </span> <span>export class Person { </span> id<span>: number; </span> name<span>: string; </span> phone<span>: string; </span> address<span>: Address; </span> <span>constructor(obj?: any) { </span> <span>this.id = obj && Number(obj.id) || null; </span> <span>this.name = obj && obj.name || null; </span> <span>this.phone = obj && obj.phone || null; </span> <span>this.address = obj && obj.address || null; </span> <span>} </span><span>} </span>Sie können SRC/App/edit/edit.component.css CSS hinzufügen, wenn Sie das Formular etwas besser aussehen möchten.
<span>export * from './search/search.service'; </span>Zu diesem Zeitpunkt sollten Sie in der Lage sein, nach einer Person zu suchen und ihre Informationen zu aktualisieren.
Das
Das obige ist der detaillierte Inhalt vonRichten Sie die Winkelauthentifizierung mit OpenID Connect und Okta in Ihrer App ein. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!