本文最初发布在OKTA开发人员博客上 。 感谢您支持使SitePoint成为可能的合作伙伴。

Angular(以前称为Angular 2.0)正迅速成为构建现代单页应用程序的最强大方法之一。 Angular的核心优势是致力于构建可重用组件,这有助于您消除应用程序中的各种问题。 以身份验证为例:构建它可能很麻烦,但是一旦将其包装在一个组件中,身份验证逻辑就可以在整个应用程序中重用。

Angular CLI使安装新组件甚至整个项目变得容易。 如果您还没有使用Angular CLI来快速生成Angular代码,那么您将大有收获!

在此示例中,您将使用Angular CLI(一个用于Angular开发的工具)构建一个简单的Web应用程序。 您将创建一个具有搜索和编辑功能的应用程序,然后添加身份验证。

创建一个Angular应用程序

提示:如果您想跳过构建Angular应用程序并直接添加身份验证,可以克隆我的ng-demo项目,然后跳到“ 在Okta中创建OpenID Connect应用程序”部分。

git clone https://github.com/mraible/ng-demo.git

您需要什么

  • 约20分钟
  • 最喜欢的文本编辑器或IDE。 我推荐IntelliJ IDEA
  • 已安装Node.js和npm。 我建议使用nvm
  • 安装了Angular CLI 。 如果您尚未安装Angular CLI,请使用npm install -g @angular/cli

使用ng new命令创建一个新项目:

ng new ng-demo

这将创建一个ng-demo项目并在其中运行npm install 。 大约需要一分钟才能完成,但是具体取决于您的连接速度。

[mraible:~/dev] $ ng new ng-demo
installing ngcreate .editorconfigcreate README.mdcreate src/app/app.component.csscreate src/app/app.component.htmlcreate src/app/app.component.spec.tscreate src/app/app.component.tscreate src/app/app.module.tscreate src/assets/.gitkeepcreate src/environments/environment.prod.tscreate src/environments/environment.tscreate src/favicon.icocreate src/index.htmlcreate src/main.tscreate src/polyfills.tscreate src/styles.csscreate src/test.tscreate src/tsconfig.app.jsoncreate src/tsconfig.spec.jsoncreate src/typings.d.tscreate .angular-cli.jsoncreate e2e/app.e2e-spec.tscreate e2e/app.po.tscreate e2e/tsconfig.e2e.jsoncreate .gitignorecreate karma.conf.jscreate package.jsoncreate protractor.conf.jscreate tsconfig.jsoncreate tslint.json
Successfully initialized git.
Installing packages for tooling via npm.
Installed packages for tooling via npm.
You can `ng set --global packageManager=yarn`.
Project 'ng-demo' successfully created.
[mraible:~] 46s $

您可以通过ng --version查看正在使用的Angular CLI ng --version

$ ng --version_                      _                 ____ _     ___/ \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|/ △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |/ ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
/_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___||___/
@angular/cli: 1.3.2
node: 8.4.0
os: darwin x64

运行您的Angular应用程序

该项目使用webpack dev server配置。 要启动它,请确保您位于ng-demo目录中,然后运行:

ng serve

您应该在http:// localhost:4200看到类似以下的屏幕。

默认主页

您可以确保新项目的测试通过,运行ng test

$ ng test
...
Chrome 60.0.3112 (Mac OS X 10.12.6): Executed 3 of 3 SUCCESS (0.239 secs / 0.213 secs)

添加搜索功能

要添加搜索功能,请在IDE或您喜欢的文本编辑器中打开项目。 对于IntelliJ IDEA,使用文件>新建项目>静态Web并指向ng-demo目录。

在终端窗口中,进入您的项目目录cd,然后运行以下命令。 这将创建一个搜索组件。

$ ng g component search
installing componentcreate src/app/search/search.component.csscreate src/app/search/search.component.htmlcreate src/app/search/search.component.spec.tscreate src/app/search/search.component.tsupdate src/app/app.module.ts

打开src/app/search/search.component.html并将其默认HTML替换为以下内容:

<h2>Search</h2>
<form><input type="search" name="query" [(ngModel)]="query" (keyup.enter)="search()"><button type="button" (click)="search()">Search</button>
</form>
<pre>{{searchResults | json}}</pre>

Angular的路由器文档提供了设置到刚刚生成的SearchComponent的路由所需的信息。 快速摘要:

src/app/app.module.ts ,添加一个appRoutes常量并将其导入@NgModule

import { Routes, RouterModule } from '@angular/router';const appRoutes: Routes = [{path: 'search', component: SearchComponent},{path: '', redirectTo: '/search', pathMatch: 'full'}
];@NgModule({...imports: [...RouterModule.forRoot(appRoutes)]...
})
export class AppModule { }

src/app/app.component.html ,调整占位符内容并添加<router-outlet>标记以显示路由。

<h1>Welcome to {{title}}!</h1>
<!-- Routed views go here -->
<router-outlet></router-outlet>

有了路由设置后,就可以继续编写搜索功能了。

如果您仍在运行ng serve ,则浏览器应会自动刷新。 如果不是,请导航至http:// localhost:4200。 您可能会看到黑屏。 打开JavaScript控制台,您将看到问题。

NG模型错误

要解决此问题,请打开src/app/app.module.ts并将FormsModule作为导入添加到@NgModule

import { FormsModule } from '@angular/forms';@NgModule({...imports: [...FormsModule]...
})
export class AppModule { }

现在,您应该看到搜索表单。

没有CSS的搜索

如果要为此组件添加CSS,请打开src/app/search/search.component.css并添加一些CSS。 例如:

:host {display: block;padding: 0 20px;
}

本节介绍了如何使用Angular CLI为基本Angular应用程序生成新组件。 下一节将向您展示如何创建和使用JSON文件和localStorage创建伪造的API。

要获取搜索结果,请创建一个SearchService ,该服务向JSON文件发出HTTP请求。 首先生成新服务。

$ ng g service search
installing servicecreate src/app/search.service.spec.tscreate src/app/search.service.tsWARNING Service is generated but not provided, it must be provided to be used

将生成的search.service.ts及其测试移至app/shared/search 。 您需要创建此目录。

mkdir -p src/app/shared/search
mv src/app/search.service.* src/app/shared/search/.

创建src/assets/data/people.json来保存数据。

[{"id": 1,"name": "Peyton Manning","phone": "(303) 567-8910","address": {"street": "1234 Main Street","city": "Greenwood Village","state": "CO","zip": "80111"}},{"id": 2,"name": "Demaryius Thomas","phone": "(720) 213-9876","address": {"street": "5555 Marion Street","city": "Denver","state": "CO","zip": "80202"}},{"id": 3,"name": "Von Miller","phone": "(917) 323-2333","address": {"street": "14 Mountain Way","city": "Vail","state": "CO","zip": "81657"}}
]

修改src/app/shared/search/search.service.ts并在其构造函数中提供Http作为依赖项。 在同一文件中,创建一个getAll()方法来收集所有人员。 此外,定义将编组JSON的AddressPerson类。

import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import 'rxjs/add/operator/map';@Injectable()
export class SearchService {constructor(private http: Http) {}getAll() {return this.http.get('assets/data/people.json').map((res: Response) => res.json());}
}export class Address {street: string;city: string;state: string;zip: string;constructor(obj?: any) {this.street = obj && obj.street || null;this.city = obj && obj.city || null;this.state = obj && obj.state || null;this.zip = obj && obj.zip || null;}
}export class Person {id: number;name: string;phone: string;address: Address;constructor(obj?: any) {this.id = obj && Number(obj.id) || null;this.name = obj && obj.name || null;this.phone = obj && obj.phone || null;this.address = obj && obj.address || null;}
}

要使这些类可供组件使用,请编辑src/app/shared/index.ts并添加以下内容:

export * from './search/search.service';

创建此文件的原因是,您可以在一行上导入多个类,而不必在单独的行上导入每个类。

src/app/search/search.component.ts ,为这些类添加导入。

import { Person, SearchService } from '../shared';

现在,您可以添加querysearchResults变量。 在那里,修改构造函数以注入SearchService

export class SearchComponent implements OnInit {query: string;searchResults: Array<Person>;constructor(private searchService: SearchService) {}

然后实现search()方法来调用服务的getAll()方法。

search(): void {this.searchService.getAll().subscribe(data => { this.searchResults = data; },error => console.log(error));
}

此时,您可能会在浏览器的控制台中看到以下消息。

ORIGINAL EXCEPTION: No provider for SearchService!

要从上方修复“无提供程序”错误,请更新app.module.ts以导入SearchService并将服务添加到提供程序列表中。 因为SearchService依赖于Http ,所以您还需要导入HttpModule

import { SearchService } from './shared';
import { HttpModule } from '@angular/http';@NgModule({...imports: [...HttpModule],providers: [SearchService],bootstrap: [AppComponent]
})

现在,单击搜索按钮应该可以了。 为了使结果看起来更好,请删除src/app/search/search.component.html中的<pre>标签,并用<table>替换它。

<table *ngIf="searchResults"><thead><tr><th>Name</th><th>Phone</th><th>Address</th></tr></thead><tbody><tr *ngFor="let person of searchResults; let i=index"><td>{{person.name}}</td><td>{{person.phone}}</td><td>{{person.address.street}}<br/>{{person.address.city}}, {{person.address.state}} {{person.address.zip}}</td></tr></tbody>
</table>

然后在src/app/search/search.component.css添加一些其他CSS,以改善其表布局。

table {margin-top: 10px;border-collapse: collapse;
}th {text-align: left;border-bottom: 2px solid #ddd;padding: 8px;
}td {border-top: 1px solid #ddd;padding: 8px;
}

现在,搜索结果看起来更好。

搜索结果

但是,等等,您仍然没有搜索功能! 要添加搜索功能,请将search()方法添加到SearchService

import { Observable } from 'rxjs';search(q: string): Observable<any> {if (!q || q === '*') {q = '';} else {q = q.toLowerCase();}return this.getAll().map(data => data.filter(item => JSON.stringify(item).toLowerCase().includes(q)));
}

然后重构SearchComponent以使用其query变量来调用此方法。

search(): void {this.searchService.search(this.query).subscribe(data => { this.searchResults = data; },error => console.log(error));
}

现在,搜索结果将通过您键入的查询值进行过滤。

本节介绍了如何获取和显示搜索结果。 下一节将以此为基础,并说明如何编辑和保存记录。

添加编辑功能

修改src/app/search/search.component.html以添加用于编辑人物的链接。

<td><a [routerLink]="['/edit', person.id]">{{person.name}}</a></td>

运行以下命令以生成EditComponent

$ ng g component edit
installing componentcreate src/app/edit/edit.component.csscreate src/app/edit/edit.component.htmlcreate src/app/edit/edit.component.spec.tscreate src/app/edit/edit.component.tsupdate src/app/app.module.ts

src/app/app.module.ts为此组件添加路由:

const appRoutes: Routes = [{path: 'search', component: SearchComponent},{path: 'edit/:id', component: EditComponent},{path: '', redirectTo: '/search', pathMatch: 'full'}
];

更新src/app/edit/edit.component.html以显示可编辑的表单。 您可能会注意到,我已经向大多数元素添加了id属性。 使用Protractor编写集成测试时,这使事情变得容易。

<div *ngIf="person"><h3>{{editName}}</h3><div><label>Id:</label>{{person.id}}</div><div><label>Name:</label><input [(ngModel)]="editName" name="name" id="name" placeholder="name"/></div><div><label>Phone:</label><input [(ngModel)]="editPhone" name="phone" id="phone" placeholder="Phone"/></div><fieldset><legend>Address:</legend><address><input [(ngModel)]="editAddress.street" id="street"><br/><input [(ngModel)]="editAddress.city" id="city">,<input [(ngModel)]="editAddress.state" id="state" size="2"><input [(ngModel)]="editAddress.zip" id="zip" size="5"></address></fieldset><button (click)="save()" id="save">Save</button><button (click)="cancel()" id="cancel">Cancel</button>
</div>

修改EditComponent以导入模型和服务类,并使用SearchService来获取数据。

import { Component, OnInit, OnDestroy } from '@angular/core';
import { Address, Person, SearchService } from '../shared';
import { Subscription } from 'rxjs';
import { ActivatedRoute, Router } from '@angular/router';@Component({selector: 'app-edit',templateUrl: './edit.component.html',styleUrls: ['./edit.component.css']
})
export class EditComponent implements OnInit, OnDestroy {person: Person;editName: string;editPhone: string;editAddress: Address;sub: Subscription;constructor(private route: ActivatedRoute,private router: Router,private service: SearchService) {}ngOnInit() {this.sub = this.route.params.subscribe(params => {const id = + params['id']; // (+) converts string 'id' to a numberthis.service.get(id).subscribe(person => {if (person) {this.editName = person.name;this.editPhone = person.phone;this.editAddress = person.address;this.person = person;} else {this.gotoList();}});});}ngOnDestroy() {this.sub.unsubscribe();}cancel() {this.router.navigate(['/search']);}save() {this.person.name = this.editName;this.person.phone = this.editPhone;this.person.address = this.editAddress;this.service.save(this.person);this.gotoList();}gotoList() {if (this.person) {this.router.navigate(['/search', {term: this.person.name} ]);} else {this.router.navigate(['/search']);}}
}

修改SearchService以包含用于通过其ID查找人员并保存人员的函数。 当您在那里时,请修改search()方法以了解localStorage的更新对象。

search(q: string): Observable<any> {if (!q || q === '*') {q = '';} else {q = q.toLowerCase();}return this.getAll().map(data => {const results: any = [];data.map(item => {// check for item in localStorageif (localStorage['person' + item.id]) {item = JSON.parse(localStorage['person' + item.id]);}if (JSON.stringify(item).toLowerCase().includes(q)) {results.push(item);}});return results;});
}get(id: number) {return this.getAll().map(all => {if (localStorage['person' + id]) {return JSON.parse(localStorage['person' + id]);}return all.find(e => e.id === id);});
}save(person: Person) {localStorage['person' + person.id] = JSON.stringify(person);
}

如果要使表单看起来更好一点,可以将CSS添加到src/app/edit/edit.component.css

:host {display: block;padding: 0 20px;
}button {margin-top: 10px;
}

此时,您应该可以搜索一个人并更新其信息。

编辑表格

src/app/edit/edit.component.html<form>调用save()函数来更新一个人的数据。 您已经在上面实现了这一点。
该函数调用gotoList()函数,该函数将用户的名字发送回搜索屏幕时,将人的名字附加到URL上。

gotoList() {if (this.person) {this.router.navigate(['/search', {term: this.person.name} ]);} else {this.router.navigate(['/search']);}
}

由于执行此URL时SearchComponent不会自动执行搜索,因此请在其构造函数中添加以下逻辑来执行此操作。

import { ActivatedRoute } from '@angular/router';
import { Subscription } from 'rxjs';
...sub: Subscription;constructor(private searchService: SearchService, private route: ActivatedRoute) {this.sub = this.route.params.subscribe(params => {if (params['term']) {this.query = decodeURIComponent(params['term']);this.search();}});
}

您将要实现OnDestroy并定义ngOnDestroy方法来清理此预订。

import { Component, OnInit, OnDestroy } from '@angular/core';export class SearchComponent implements OnInit, OnDestroy {
...ngOnDestroy() {this.sub.unsubscribe();}
}

进行所有这些更改之后,您应该能够搜索/编辑/更新一个人的信息。 如果可行–做得好!

表格验证

您可能会注意到的一件事是,您可以清除表单中的任何输入元素并将其保存。 至少,必须输入name字段。 否则,搜索结果中没有任何可单击的内容。

要使名称为必需,请修改edit.component.html以将required属性添加到名称<input>

<input [(ngModel)]="editName" name="name" id="name" placeholder="name" required/>

您还需要将所有内容包装在<form>元素中。 在<h3>标记之后添加<form> ,并在最后一个</div>之前将其关闭。 您还需要向表单添加一个(ngSubmit)处理函数,并将保存按钮更改为常规的提交按钮。

<h3>{{editName}}</h3>
<form (ngSubmit)="save()" ngNativeValidate>...<button type="submit" id="save">Save</button><button (click)="cancel()" id="cancel">Cancel</button>
</form>

进行这些更改后,将需要具有required属性的任何字段。

编辑表单验证

在此屏幕截图中,您可能会注意到地址字段为空白。 控制台中的错误说明了这一点。

If ngModel is used within a form tag, either the name attribute must be set or the form
control must be defined as 'standalone' in ngModelOptions.Example 1: <input [(ngModel)]="person.firstName" name="first">
Example 2: <input [(ngModel)]="person.firstName" [ngModelOptions]="{standalone: true}">

要解决此问题,请将name属性添加到所有地址字段。 例如:

<address><input [(ngModel)]="editAddress.street" name="street" id="street"><br/><input [(ngModel)]="editAddress.city" name="city" id="city">,<input [(ngModel)]="editAddress.state" name="state" id="state" size="2"><input [(ngModel)]="editAddress.zip" name="zip" id="zip" size="5">
</address>

现在,值应显示在所有字段中,并且name是必需的。

编辑表格名称

如果要提供自己的验证消息而不是依赖浏览器的验证消息,请完成以下步骤:

  1. 删除ngNativeValidate并将#editForm="ngForm"添加到<form>元素。
  2. #name="ngModel"添加到<input id="name">元素。
  3. [disabled]="!editForm.form.valid"到“ 保存”按钮。
  4. name字段下添加以下内容以显示验证错误。
<div [hidden]="name.valid || name.pristine" style="color: red">Name is required
</div>

要了解有关表单和验证的更多信息,请参阅Angular表单文档 。

在Okta中创建OpenID Connect应用程序

OpenID Connect(OIDC)建立在OAuth 2.0协议之上。 它允许客户端验证用户的身份,以及获取其基本配置文件信息。 要了解更多信息,请参阅https://openid.net/connect 。

要集成Okta进行用户身份验证,您首先需要注册并创建OIDC应用程序。

登录到您的Okta帐户,如果没有,请创建一个。 导航到应用程序 ,然后单击添加应用程序按钮。 选择SPA并单击Next 。 在下一页上,将http://localhost:4200指定为基本URI,登录重定向URI和注销重定向URI。 单击完成 ,您应该看到类似以下的设置。

OIDC应用设置

安装Manfred Steyer的项目,以使用npm 添加OAuth 2和OpenID Connect支持 。

npm install --save angular-oauth2-oidc

修改src/app/app.component.ts以导入OAuthService并配置您的应用程序以使用Okta应用程序的设置。

import { OAuthService, JwksValidationHandler } from 'angular-oauth2-oidc';...constructor(private oauthService: OAuthService) {this.oauthService.redirectUri = window.location.origin;this.oauthService.clientId = '{client-id}';this.oauthService.scope = 'openid profile email';this.oauthService.issuer = 'https://dev-{dev-id}.oktapreview.com';this.oauthService.tokenValidationHandler = new JwksValidationHandler();// Load Discovery Document and then try to login the userthis.oauthService.loadDiscoveryDocument().then(() => {this.oauthService.tryLogin();});}
...

创建src/app/home/home.component.ts并将其配置为具有“ 登录”和“ 注销”按钮。

import { Component } from '@angular/core';
import { OAuthService } from 'angular-oauth2-oidc';@Component({template: `<div *ngIf="givenName"><h2>Welcome, {{givenName}}!</h2><button (click)="logout()">Logout</button><p><a routerLink="/search" routerLinkActive="active">Search</a></p></div><div *ngIf="!givenName"><button (click)="login()">Login</button></div>`
})
export class HomeComponent {constructor(private oauthService: OAuthService) {}login() {this.oauthService.initImplicitFlow();}logout() {this.oauthService.logOut();}get givenName() {const claims = this.oauthService.getIdentityClaims();if (!claims) {return null;}return claims['name'];}
}

创建src/app/shared/auth/auth.guard.service.ts导航到HomeComponent如果用户不被认证。

import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';
import { OAuthService } from 'angular-oauth2-oidc';@Injectable()
export class AuthGuard implements CanActivate {constructor(private oauthService: OAuthService, private router: Router) {}canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {if (this.oauthService.hasValidIdToken()) {return true;}this.router.navigate(['/home']);return false;}
}

出口AuthGuardsrc/shared/index.ts

export * from './auth/auth.guard.service';

导入OAuthModulesrc/app/app.module.ts ,配置新的HomeComponent ,并锁定/search/edit路线打倒AuthGuard

import { OAuthModule } from 'angular-oauth2-oidc';
import { HomeComponent } from './home/home.component';
import { SearchService, AuthGuard } from './shared';const appRoutes: Routes = [{path: 'search', component: SearchComponent, canActivate: [AuthGuard]},{path: 'edit/:id', component: EditComponent, canActivate: [AuthGuard]},{path: 'home', component: HomeComponent},{path: '', redirectTo: 'home', pathMatch: 'full'},{path: '**', redirectTo: 'home'}
];@NgModule({declarations: [...HomeComponent],imports: [...OAuthModule.forRoot()],providers: [AuthGuard,SearchService],bootstrap: [AppComponent]
})
export class AppModule { }

进行这些更改之后,您应该可以运行ng serve并看到一个登录按钮。

Okta登录按钮

单击“ 登录”按钮,然后使用Okta应用程序中配置的人员之一登录

Okta登录表单

登录后,您将可以单击搜索并查看人们的信息。

Okta Post登录

如果可行,那就太好了! 如果要在应用程序中构建自己的登录表单,请继续阅读以了解如何将Okta Auth SDK与OAuthService

使用Okta Auth SDK进行身份验证

Okta Auth SDK建立在Otka的Authentication API和OAuth 2.0 API的基础上 ,使您能够使用JavaScript创建完全品牌化的登录体验。

使用npm安装它:

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

.angular-cli.json添加对该库的主要JavaScript文件.angular-cli.json

"scripts": ["../node_modules/@okta/okta-auth-js/dist/okta-auth-js.min.js"
],

本节中的组件使用Bootstrap CSS类。 安装Bootstrap 4。

npm install bootstrap@4.0.0-beta --save

修改src/styles.css以添加对Bootstrap的CSS文件的引用。

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

更新src/app/app.component.html以将Bootstrap类用于其导航栏和网格系统。

<nav class="navbar navbar-light bg-secondary"><a class="navbar-brand text-light" href="#">Welcome to {{title}}!</a>
</nav>
<div class="container-fluid"><router-outlet></router-outlet>
</div>

创建src/app/shared/auth/okta.auth.wrapper.ts来包装Okta Auth SDK并将其与OAuthService集成。 它的login()方法使用OktaAuth获取会话令牌并将其交换为ID和访问令牌。

import { OAuthService } from 'angular-oauth2-oidc';
import { Injectable } from '@angular/core';declare const OktaAuth: any;@Injectable()
export class OktaAuthWrapper {private authClient: any;constructor(private oauthService: OAuthService) {this.authClient = new OktaAuth({url: this.oauthService.issuer});}login(username: string, password: string): Promise<any> {return this.oauthService.createAndSaveNonce().then(nonce => {return this.authClient.signIn({username: username,password: password}).then((response) => {if (response.status === 'SUCCESS') {return this.authClient.token.getWithoutPrompt({clientId: this.oauthService.clientId,responseType: ['id_token', 'token'],scopes: ['openid', 'profile', 'email'],sessionToken: response.sessionToken,nonce: nonce,redirectUri: window.location.origin}).then((tokens) => {const idToken = tokens[0].idToken;const accessToken = tokens[1].accessToken;const keyValuePair = `#id_token=${encodeURIComponent(idToken)}&access_token=${encodeURIComponent(accessToken)}`;return this.oauthService.tryLogin({ <1>customHashFragment: keyValuePair,disableOAuth2StateCheck: true});});} else {return Promise.reject('We cannot handle the ' + response.status + ' status');}});});}
}

在上面的代码中, oauthService.tryLogin()解析并存储idTokenaccessToken以便可以使用OAuthService.getIdToken()OAuthService.getAccessToken()进行检索。

出口OktaAuthWrappersrc/shared/index.ts

export * from './auth/okta.auth.wrapper';

添加OktaAuthWrapper作为一个供应商app.module.ts

import { SearchService, AuthGuard, OktaAuthWrapper } from './shared';@NgModule({...providers: [...OktaAuthWrapper],bootstrap: [AppComponent]
})

更改HomeComponent申报OktaAuth并修改其template所以它有一个按钮来登录,以及一个登录表单。

@Component({template: `<div *ngIf="givenName" class="col-12 mt-2"><button (click)="logout()" class="btn btn-sm btn-outline-primary float-right">Logout</button><h2>Welcome, {{givenName}}!</h2><p><a routerLink="/search" routerLinkActive="active">Search</a></p></div><div class="card mt-2" *ngIf="!givenName"><div class="card-body"><h4 class="card-title">Login with Authorization Server</h4><button class="btn btn-primary" (click)="login()">Login</button></div></div><div class="card mt-2" *ngIf="!givenName"><div class="card-body"><h4 class="card-title">Login with Username/Password</h4><p class="alert alert-error" *ngIf="loginFailed">Login wasn't successful.</p><div class="form-group"><label>Username</label><input class="form-control" [(ngModel)]="username"></div><div class="form-group"><label>Password</label><input class="form-control" type="password" [(ngModel)]="password"></div><div class="form-group"><button class="btn btn-primary" (click)="loginWithPassword()">Login</button></div></div></div>`
})

进行这些更改后, HomeComponent应该呈现如下。

自定义登录表格

添加局部变量的用户名和密码字段,进口OktaAuthWrapper ,并实施loginWithPassword()的方法HomeComponent

import { OktaAuthWrapper } from '../shared';
...username;
password;constructor(private oauthService: OAuthService,private oktaAuthWrapper: OktaAuthWrapper) {
}loginWithPassword() {this.oktaAuthWrapper.login(this.username, this.password).then(_ => console.debug('logged in')).catch(err => console.error('error logging in', err));
}

您应该能够使用应用程序的注册用户之一使用该表单登录。 登录后,您将可以单击“ 搜索”链接并查看人们的信息。

登录后查看

角+ Okta

如果一切正常–恭喜! 如果遇到问题,请使用okta标签将问题发布到Stack Overflow,或在Twitter @mraible上打我。

您可以在GitHub上的此博客文章中找到该应用程序的完整版本。 要了解有关Angular安全性的更多信息,请参阅Angular的安全性文档 。 如果您想了解有关OpenID Connect的更多信息,建议您观看下面的舒缓视频。

From: https://www.sitepoint.com/angular-authentication-oidc/

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 使用Auth0对Firebase和Angular进行身份验证:第2部分

    本文最初发布在Auth0.com博客上 &#xff0c;并经许可在此处重新发布。 在这个由两部分组成的教程系列中&#xff0c;我们将学习如何构建一个使用Auth0身份验证保护Node后端和Angular前端安全的应用程序。 我们的服务器和应用程序还将使用自定义令牌对Firebase Cloud Firestore…...

    2024/4/21 6:24:01
  2. ASP.NET Core:使用IdentityServer构建可靠的身份验证和授权系统

    目录 OAuth 2.0到底是什么&#xff1f; 为什么使用OpenID Connect&#xff1f; 向IdentityServer打个招呼&#xff01;&#x1f44b; Hello World程序 设置中央身份验证系统所需的步骤——从1000英尺开始查看 从头开始设置身份验证服务器 构建一个MVC应用 设置一个Angu…...

    2024/5/7 19:33:41
  3. 埋线双眼皮医院哪家好

    ...

    2024/5/7 15:27:53
  4. 使用Auth0对Firebase和Angular进行身份验证:第1部分

    本文最初发布在Auth0.com博客上 &#xff0c;并经许可在此处重新发布。 在这个由两部分组成的教程系列中&#xff0c;我们将学习如何构建一个使用Auth0身份验证保护Node后端和Angular前端安全的应用程序。 我们的服务器和应用程序还将使用自定义令牌对Firebase Cloud Firestore…...

    2024/4/23 9:16:55
  5. Angular:路由守卫AuthGuardProvider中的checkLogin验证登录状态

    系统中路由想要被访问&#xff0c;需要先通过路由守卫验证&#xff0c;看当前用户是否登录&#xff1a; AuthGuardProvider路由守卫服务&#xff1a; /** Author: Wangcan* Date: 2018-05-16 13:34:23* Last Modified by: Wangcan* Last Modified time: 2019-08-17 15:46:20*…...

    2024/4/29 0:09:30
  6. 在Angular应用程序中实现身份验证

    身份验证和授权是几乎每个严肃应用程序中的重要部分。 单页应用程序&#xff08;SPA&#xff09;也不例外。 该应用程序可能不会仅向任何用户公开其所有数据和功能。 用户可能必须进行身份验证才能查看应用程序的某些部分&#xff0c;或对应用程序执行某些操作。 要在应用程序中…...

    2024/4/20 19:07:45
  7. 荆州哪里割双眼皮很好

    ...

    2024/4/20 19:07:43
  8. flask身份验证_Flask基于令牌的身份验证

    flask身份验证This tutorial takes a test-first approach to implementing token-based authentication in a Flask app using JSON Web Tokens (JWTs). 本教程采用测试优先的方法&#xff0c;使用JSON Web令牌&#xff08;JWT&#xff09;在Flask应用中实现基于令牌的身份验证…...

    2024/4/20 19:07:43
  9. 在SPA应用中利用JWT进行身份验证

    在SPA应用中利用JWT进行身份验证 2018.3.21版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 SPA SPA即Single Page Application&#xff0c;单页应用程序&#xff0c;是一种Web应用程序或网站&#xff0c;通过动态地重写当前的页面&#…...

    2024/4/20 19:07:41
  10. angular学习之路14-表单验证

    1&#xff0c;模板驱动验证 每当表单控件中的值发生变化时&#xff0c;Angular 就会进行验证&#xff0c;并生成一个验证错误的列表&#xff08;对应着 INVALID 状态&#xff09;或者 null&#xff08;对应着 VALID 状态&#xff09;。 你可以通过把 ngModel 导出成局部模板变…...

    2024/4/21 6:24:00
  11. 埋线双眼皮哪里做的好

    ...

    2024/4/21 6:23:59
  12. angular 异步验证_在Angular应用程序中实现身份验证

    angular 异步验证身份验证和授权是几乎所有严肃应用程序中的重要组成部分。 单页应用程序&#xff08;SPA&#xff09;也不例外。 该应用程序可能不会仅向任何用户公开其所有数据和功能。 用户可能必须进行身份验证才能查看应用程序的某些部分&#xff0c;或对应用程序执行某些…...

    2024/4/21 6:23:58
  13. 韩式双眼皮需要多少钱

    ...

    2024/4/21 6:24:00
  14. 北京生物焊接内双 割合肥韩式三点北京双眼皮多少钱

    ...

    2024/4/21 6:23:55
  15. 重庆做双眼皮好

    ...

    2024/4/21 6:23:54
  16. (三)ng-app的使用困惑和angularJS框架的自动加载

    ng-app是angular的一个指令&#xff0c;代表一个angular应用&#xff08;也叫模块&#xff09;。使用ng-app或ng-app""来标记一个DOM结点&#xff0c;让框架会自动加载。也就是说&#xff0c;ng-app是可以带属性值的。如果想要实现自动加载&#xff0c;那么就不能让n…...

    2024/4/21 6:23:53
  17. 网络封包基础,执着游戏外挂教程

    要想在修改游戏中做到百战百胜,是需要相当丰富的计算机知识的。有很多计算机高手就是从玩游戏,修改游戏中,逐步 对计算机产生浓厚的兴趣,逐步成长起来的。不要在羡慕别人能够做到的,因为别人能够做的你也能够!我相信你们看了 本教程后,会对游戏有一个全新的认识,呵呵,…...

    2024/4/30 0:03:58
  18. ng-template、ng-container、ng-content 的用法

    ng-container&#xff1a;此标签不渲染成DOM&#xff1b;默认显示标签内部内容&#xff0c;也可以使用结构型指令&#xff08;ngIf、ngFor...&#xff09; 官网详细介绍&#xff1a;https://angular.cn/guide/structural-directives eg&#xff1a;代码块 <ng-container&…...

    2024/4/21 6:23:51
  19. 双眼皮线10年能拆么

    ...

    2024/4/21 6:23:50
  20. 新手学AngularJs之ng-app

    ng-app ng-app:是angular的一个指令&#xff0c;使用ng-app或者ng-app”“来标记一个dom节点&#xff0c;让框架会自动加载&#xff0c;换言之也就是说ng-app是可以带属性的&#xff0c;用ng-app来标记了某一个dom节点&#xff0c;就表示要告诉angular&#xff0c;当前标记的这…...

    2024/4/21 6:23:51

最新文章

  1. 基于点灯Blinker的ESP8266远程网络遥控LED

    本文介绍基于ESP8266模块实现的远程点灯操作&#xff0c;手机侧APP选用的是点灯-Blinker&#xff0c;完整资料及软件见文末链接 一、ESP8266模块简介 ESP8266是智能家居等物联网场景下常用的数传模块&#xff0c;具有强大的功能&#xff0c;通过串口转WIFI的方式可实现远距离…...

    2024/5/8 7:44:31
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/7 10:36:02
  3. promise.all方式使用

    romise.all( ).then( ) 处理多个异步任务&#xff0c;且所有的异步任务都得到结果时的情况。 比如&#xff1a;用户点击按钮&#xff0c;会弹出一个弹出对话框&#xff0c;对话框中有两部分数据呈现&#xff0c;这两部分数据分别是不同的后端接口获取的数据。 弹框弹出后的初…...

    2024/5/8 5:48:17
  4. HIS系统是什么?一套前后端分离云HIS系统源码 接口技术RESTful API + WebSocket + WebService

    HIS系统是什么&#xff1f;一套前后端分离云HIS系统源码 接口技术RESTful API WebSocket WebService 医院管理信息系统(全称为Hospital Information System)即HIS系统。 常规模版包括门诊管理、住院管理、药房管理、药库管理、院长查询、电子处方、物资管理、媒体管理等&…...

    2024/5/7 12:48:55
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/8 6:01:22
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/7 9:45:25
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/7 14:25:14
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/7 11:36:39
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/7 9:26:26
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/6 21:42:42
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57