Restrict webauthn to fingerprint only and improve UX (#161)
* Restrict webauthn to fingerprint only * Move webauthn login to separate page /webauthn * Stay signed in with social login * Update changelog Co-authored-by: Thomas <4159106+dtslvr@users.noreply.github.com>pull/162/head
parent
698d5ec3b7
commit
6c1119caec
@ -0,0 +1,11 @@
|
||||
import { NgModule } from '@angular/core';
|
||||
import { RouterModule, Routes } from '@angular/router';
|
||||
import { WebauthnPageComponent } from '@ghostfolio/client/pages/webauthn/webauthn-page.component';
|
||||
|
||||
const routes: Routes = [{ path: '', component: WebauthnPageComponent }];
|
||||
|
||||
@NgModule({
|
||||
imports: [RouterModule.forChild(routes)],
|
||||
exports: [RouterModule]
|
||||
})
|
||||
export class WebauthnPageRoutingModule {}
|
@ -0,0 +1,46 @@
|
||||
import { ChangeDetectorRef, Component, OnInit } from '@angular/core';
|
||||
import { Router } from '@angular/router';
|
||||
import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service';
|
||||
import { WebAuthnService } from '@ghostfolio/client/services/web-authn.service';
|
||||
|
||||
@Component({
|
||||
selector: 'gf-webauthn-page',
|
||||
templateUrl: './webauthn-page.html',
|
||||
styleUrls: ['./webauthn-page.scss']
|
||||
})
|
||||
export class WebauthnPageComponent implements OnInit {
|
||||
public hasError = false;
|
||||
|
||||
constructor(
|
||||
private changeDetectorRef: ChangeDetectorRef,
|
||||
private router: Router,
|
||||
private tokenStorageService: TokenStorageService,
|
||||
private webAuthnService: WebAuthnService
|
||||
) {}
|
||||
|
||||
public ngOnInit() {
|
||||
this.signIn();
|
||||
}
|
||||
|
||||
public deregisterDevice() {
|
||||
this.webAuthnService.deregister().subscribe(() => {
|
||||
this.router.navigate(['/']);
|
||||
});
|
||||
}
|
||||
|
||||
public signIn() {
|
||||
this.hasError = false;
|
||||
|
||||
this.webAuthnService.login().subscribe(
|
||||
({ authToken }) => {
|
||||
this.tokenStorageService.saveToken(authToken, false);
|
||||
this.router.navigate(['/']);
|
||||
},
|
||||
(error) => {
|
||||
console.error(error);
|
||||
this.hasError = true;
|
||||
this.changeDetectorRef.markForCheck();
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div *ngIf="!hasError" class="col d-flex justify-content-center">
|
||||
<mat-spinner [diameter]="20"></mat-spinner>
|
||||
</div>
|
||||
<div
|
||||
*ngIf="hasError"
|
||||
class="align-items-center col d-flex flex-column justify-content-center"
|
||||
>
|
||||
<h3 class="d-flex justify-content-center" i18n>
|
||||
Oops, authentication failed
|
||||
</h3>
|
||||
<button
|
||||
(click)="signIn()"
|
||||
class="my-4"
|
||||
color="primary"
|
||||
i18n
|
||||
mat-flat-button
|
||||
>
|
||||
Try again
|
||||
</button>
|
||||
<button (click)="deregisterDevice()" i18n mat-flat-button>
|
||||
Go back to Home Page
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
@ -0,0 +1,20 @@
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
||||
import { WebauthnPageComponent } from '@ghostfolio/client/pages/webauthn/webauthn-page.component';
|
||||
|
||||
import { WebauthnPageRoutingModule } from './webauthn-page-routing.module';
|
||||
|
||||
@NgModule({
|
||||
declarations: [WebauthnPageComponent],
|
||||
exports: [],
|
||||
imports: [
|
||||
CommonModule,
|
||||
MatButtonModule,
|
||||
MatProgressSpinnerModule,
|
||||
WebauthnPageRoutingModule
|
||||
],
|
||||
providers: []
|
||||
})
|
||||
export class WebauthnPageModule {}
|
Loading…
Reference in new issue