JWTトークン認証を使用して.Net Core Rest APIにログインするAngular 8アプリケーションを開発しています。
アプリケーションを起動すると、アプリケーションはエラーなしで正常にコンパイルされます。しかし、 http:// localhost:42 を開くと、空白のページが表示されます。
これがapp-routing.module.ts
ファイルです。
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { LoginComponent } from './login';
import { HomeComponent } from './home';
import { AppComponent } from './app.component';
import { AuthGuard } from './_helpers';
const routes: Routes = [
{path: '',component:AppComponent,canActivate: [AuthGuard]},
{path:'login',component:LoginComponent},
{path: '**',redirectTo:''}
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
これがapp.component.ts
ファイルです。
import { Component ,ViewChild,OnInit } from '@angular/core';
import { ApiService } from './api.service';
import { Router } from '@angular/router';
import {Sort} from '@angular/material';
import { Log } from './log';
import {MatPaginator,MatSort,MatTableDataSource} from '@angular/material';
import { AuthenticationService } from './_services';
import { User } from './_models';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent{
currentUser: User;
public isViewable:boolean;
constructor(private apiService: ApiService,private router: Router,private authenticationService: AuthenticationService){
this.authenticationService.currentUser.subscribe(x => this.currentUser = x);
}
dataSource=new MatTableDataSource<Log>();
displayedColumns: string[] = ['message','create_Date','log_Type'];
@ViewChild(MatSort,{static:true}) sort: MatSort;
ngOnInit(){
this.dataSource.sort=this.sort;
this.apiService.getLogs().subscribe((res)=>{
this.dataSource.data=res;
});
}
public onSortData(sort:Sort){
let data=this.dataSource.data.slice();
if(sort.active && sort.direction!==''){
data=data.sort((a:Log,b:Log)=>{
const isAsc=sort.direction==='asc';
switch(sort.active){
case 'message': return this.compare(a.message,b.message,isAsc);
case 'create_Date':return this.compare(a.create_Date,b.create_Date,isAsc);
case 'log_Type':return this.compare(a.log_Type,b.log_Type,isAsc);
default: return 0;
}
});
}
this.dataSource.data=data;
}
private compare(a,b,isAsc){
return (a.toLowerCase() < b.toLowerCase() ? -1 : 1) * (isAsc ? 1:-1);
}
public toggle():void{
this.isViewable=!this.isViewable;
this.apiService.getLogs().subscribe((res)=>{
this.dataSource.data=res;
});
}
logout() {
this.authenticationService.logout();
this.router.navigate(['/login']);
}
}
これがlogin.component.ts
ファイルです。
import { Component, OnInit } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { first } from 'rxjs/operators';
import { AuthenticationService } from '../_services';
@Component({ templateUrl: 'login.component.html' })
export class LoginComponent implements OnInit {
loginForm: FormGroup;
loading = false;
submitted = false;
returnUrl: string;
error = '';
constructor(
private formBuilder: FormBuilder,
private route: ActivatedRoute,
private router: Router,
private authenticationService: AuthenticationService
) {
// redirect to home if already logged in
if (this.authenticationService.currentUserValue) {
this.router.navigate(['/']);
}
}
ngOnInit() {
this.loginForm = this.formBuilder.group({
username: ['', Validators.required],
password: ['', Validators.required]
});
// get return url from route parameters or default to '/'
this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/';
}
// convenience getter for easy access to form fields
get f() { return this.loginForm.controls; }
onSubmit() {
this.submitted = true;
// stop here if form is invalid
if (this.loginForm.invalid) {
return;
}
this.loading = true;
this.authenticationService.login(this.f.username.value, this.f.password.value)
.pipe(first())
.subscribe(
data => {
this.router.navigate([this.returnUrl]);
},
error => {
this.error = error;
this.loading = false;
});
}
}
編集:
これがauth.guard.ts
ファイルです。
import { Injectable } from '@angular/core';
import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { AuthenticationService } from '../_services';
@Injectable({ providedIn: 'root' })
export class AuthGuard implements CanActivate {
constructor(
private router: Router,
private authenticationService: AuthenticationService
) { }
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
const currentUser = this.authenticationService.currentUserValue;
if (currentUser) {
// logged in so return true
return true;
}
// not logged in so redirect to login page with the return url
this.router.navigate(['/login'], { queryParams: { returnUrl: state.url } });
return false;
}
}
ログインページが表示されることを期待していますが、ng serve
と入力して開いた後、空白のページが表示されます http:// localhost:42
chromeブラウザ、chromeバージョンを更新した後、ブラウザで同じ問題が修正されました。ブラウザに関連するこの問題を確認するには、 IEまたはSafariのような他のブラウザでのクロスチェック。
編集:これに加えて、Chromeの一部の拡張機能を無効にしてみてください。拡張機能を無効にしたら、必ずブラウザを再起動してください。動作したら、必要な拡張機能を有効にします。
この問題は、アプリケーションの開始時に実行されるコードのエラーに関連している可能性があります。これにはおそらく、あらゆる種類の認証モジュールの開始が含まれます。
app.module.ts
およびAPP_INITIALIZER
など、そこから呼び出されるすべてのものを確認/デバッグします。
おそらく、サポートされていないバージョンのIEを使用していますか?
後でChromeを試してくださいIEまたはFirefoxなど。または、polyfills.tsでブラウザのポリフィルのコメントを外してください。
/** IE9, IE10 and IE11 requires all of the following polyfills. **/
import 'core-js/es6/array';
import 'core-js/es6/date';
import 'core-js/es6/function';
import 'core-js/es6/map';
import 'core-js/es6/math';
import 'core-js/es6/number';
import 'core-js/es6/object';
import 'core-js/es6/parse-float';
import 'core-js/es6/parse-int';
import 'core-js/es6/regexp';
import 'core-js/es6/set';
import 'core-js/es6/string';
import 'core-js/es6/symbol';
import 'core-js/es6/weak-map';
私は同じ問題に直面しているので、ページを2回更新するだけで問題は解決しますが、angularが入力したルートが見つからない場合は、PageNotFoundComponent
にリダイレクトできます。 、それで、コンポーネントPageNotFoundComponent
を作成し、そのコンポーネントにリダイレクトします。指定したルート以外の他のすべてのルートでは処理しないからです。
{path: '**',redirectTo:''} // instead of this
{path: '**', redirectTo:'PageNotFoundComponent'} // add this
または、routerConfigで{ useHash: true }
を使用してこれを試すと、すべてのルートで#/login
が使用され、開発モードでのみ使用できます。公開する場合は、この構成を削除できます{ useHash: true }
@NgModule({
imports: [
...
...
RouterModule.forRoot(routes, { useHash: true }) // .../#/crisis-center/
],
...
})
export class AppModule { }
「AuthGuard」を確認してください。trueが返されるかどうかを確認してください。デフォルトのルートは保護されており、それがfalseを返した場合、ページが読み込まれないのはそのためだと思います。