refactor: rewrite oauth setup for the new api
This commit is contained in:
@ -1,4 +1,4 @@
|
||||
@if (providers.length !== 0) {
|
||||
@if (!loading && providers.length !== 0) {
|
||||
<hr/>
|
||||
<div>
|
||||
<p class="mat-body-2 secondary">{{ message }}</p>
|
||||
@ -17,4 +17,7 @@
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
} @else if (loading) {
|
||||
<hr/>
|
||||
<app-data-spinner style="display: flex; justify-content: center;"/>
|
||||
}
|
||||
|
@ -1,9 +1,10 @@
|
||||
import {Component, EventEmitter, Inject, Input, Output} from '@angular/core';
|
||||
import {Component, EventEmitter, Inject, Input, OnInit, Output} from '@angular/core';
|
||||
import AuthApiService, {OAuthProviderData} from "@api/v1/authApiService";
|
||||
import {OAuthProvider} from "@model/oAuthProvider";
|
||||
import {ToastrService} from "ngx-toastr";
|
||||
import {
|
||||
MAT_DIALOG_DATA, MatDialog,
|
||||
MAT_DIALOG_DATA,
|
||||
MatDialog,
|
||||
MatDialogActions,
|
||||
MatDialogContent,
|
||||
MatDialogRef,
|
||||
@ -11,6 +12,11 @@ import {
|
||||
} from "@angular/material/dialog";
|
||||
import {MatButton} from "@angular/material/button";
|
||||
import {DataSpinnerComponent} from "@component/common/data-spinner/data-spinner.component";
|
||||
import {ActivatedRoute} from "@angular/router";
|
||||
import {catchError, finalize, Observable, switchMap, tap} from "rxjs";
|
||||
import {TwoFactorAuthentication} from "@model/twoFactorAuthentication";
|
||||
import {OAuthAction} from "@model/oAuthAction";
|
||||
import SetupService from "@api/v1/setup.service";
|
||||
|
||||
interface AvailableOAuthProviders extends OAuthProviderData {
|
||||
disabled: boolean;
|
||||
@ -60,12 +66,13 @@ export class DeleteConfirmDialog {
|
||||
],
|
||||
templateUrl: './OAuthProviders.html',
|
||||
styleUrl: './OAuthProviders.css',
|
||||
providers: [AuthApiService]
|
||||
providers: [SetupService, AuthApiService]
|
||||
})
|
||||
export class OAuthProviders {
|
||||
export class OAuthProviders implements OnInit {
|
||||
protected providers: AvailableOAuthProviders[] = [];
|
||||
protected _activeProvidersId: OAuthProvider[] = [];
|
||||
protected _activeProviders: string[] = [];
|
||||
protected loading = true;
|
||||
|
||||
@Input() message: string = 'Вы можете войти в аккаунт через';
|
||||
|
||||
@ -80,11 +87,73 @@ export class OAuthProviders {
|
||||
}
|
||||
|
||||
@Input() canUnlink: boolean = false;
|
||||
@Input() action: OAuthAction = OAuthAction.Login;
|
||||
@Input() isSetup: boolean = false;
|
||||
|
||||
@Output() public oAuthUpdateProviders = new EventEmitter();
|
||||
@Output() public oAuthLoginResult: EventEmitter<TwoFactorAuthentication> = new EventEmitter();
|
||||
|
||||
constructor(authApi: AuthApiService, private notify: ToastrService, private dialog: MatDialog) {
|
||||
authApi.availableProviders().subscribe(providers => this.updateDisabledProviders(providers));
|
||||
constructor(private setupApi: SetupService,
|
||||
private authApi: AuthApiService,
|
||||
private notify: ToastrService,
|
||||
private dialog: MatDialog,
|
||||
private route: ActivatedRoute) {
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
const fullUrl = `${window.location.protocol}//${window.location.host}${window.location.pathname}`;
|
||||
this.authApi.availableProviders(fullUrl).subscribe(providers => {
|
||||
this.updateDisabledProviders(providers);
|
||||
});
|
||||
|
||||
this.route.queryParamMap
|
||||
.pipe(
|
||||
switchMap(params => {
|
||||
const result = params.get('result');
|
||||
|
||||
if (!result) {
|
||||
this.loading = false; // Нет результата, завершение загрузки
|
||||
return [];
|
||||
}
|
||||
|
||||
return this.handleOAuthResult(result); // Обрабатываем результат
|
||||
}),
|
||||
catchError(_ => {
|
||||
this.loading = false;
|
||||
return [];
|
||||
})
|
||||
)
|
||||
.subscribe();
|
||||
}
|
||||
|
||||
private handleOAuthResult(result: string): Observable<any> {
|
||||
switch (this.action) {
|
||||
case OAuthAction.Login:
|
||||
return this.authApi.loginOAuth(result).pipe(
|
||||
tap(auth => {
|
||||
this.oAuthLoginResult.emit(auth);
|
||||
}),
|
||||
finalize(() => {
|
||||
this.loading = false;
|
||||
})
|
||||
);
|
||||
|
||||
case OAuthAction.Bind:
|
||||
if (this.isSetup) {
|
||||
return this.setupApi.registerOAuth(result).pipe(
|
||||
tap(() => {
|
||||
this.oAuthUpdateProviders.emit();
|
||||
}),
|
||||
finalize(() => {
|
||||
this.loading = false;
|
||||
})
|
||||
);
|
||||
} else
|
||||
throw new Error('Action "Bind" requires setup mode to be enabled.');
|
||||
break;
|
||||
default:
|
||||
throw new Error('Unknown action type for action ' + this.action);
|
||||
}
|
||||
}
|
||||
|
||||
private updateDisabledProviders(data: OAuthProviderData[] | null = null) {
|
||||
@ -98,26 +167,15 @@ export class OAuthProviders {
|
||||
}
|
||||
|
||||
protected openOAuth(provider: AvailableOAuthProviders) {
|
||||
console.log(provider.redirect);
|
||||
const oauthWindow = window.open(
|
||||
provider.redirect,
|
||||
'_blank',
|
||||
'_self'
|
||||
);
|
||||
|
||||
if (!oauthWindow) {
|
||||
this.notify.error('Не удалось открыть OAuth окно');
|
||||
return;
|
||||
}
|
||||
|
||||
provider.active = true;
|
||||
|
||||
const checkInterval = setInterval(() => {
|
||||
if (oauthWindow.closed) {
|
||||
clearInterval(checkInterval);
|
||||
this.oAuthUpdateProviders.emit();
|
||||
provider.active = false;
|
||||
}
|
||||
}, 1500);
|
||||
}
|
||||
|
||||
protected confirmDelete(provider: AvailableOAuthProviders) {
|
||||
|
Reference in New Issue
Block a user