mirror of
https://github.com/zitadel/zitadel.git
synced 2025-12-05 18:12:07 +00:00
* onboarding components, routing, steps * onboarding component, toc * fix onboarding mixin * header * refactor docs * fix layout * cleanup routing * docs routing * fix conventions * de en routing * docs, guide contents, nav * rem i18n support * fix routing from docs * rollup onwarn changes, preload * update svelte plugin, update rollup config * move docs * revert img style, remove code table * rem de completely * rollup optim, template * angular quickstart, quickstart overview page, update deps * fix link * pack, slug * prefetch binding, hidden links * export log * guards route ch * fix homepage * angular docs * docs * resolve fsh * overview * docs * docs * packages fix race condition * nav, home link * add vue, aspnet * doc optimizations * embed status pal * angular guide * angular guide * dotnet, angular guide * viewbox * typo * block onboarding route for non iam writers * set links from component data * fix: fetch org context in guard, more main cnt (#1192) * change get started guide, fix code blockquotes, typos * flutter guide * h2 spacing * highlight strong * plus * rm start sublinks * add proxy quickstart * regex * prevent outside click, fix project grant write Co-authored-by: Florian Forster <florian@caos.ch> Co-authored-by: Livio Amstutz <livio.a@gmail.com>
69 lines
2.4 KiB
TypeScript
69 lines
2.4 KiB
TypeScript
import { Injectable } from '@angular/core';
|
|
import { MatDialog } from '@angular/material/dialog';
|
|
import { Request, UnaryInterceptor, UnaryResponse } from 'grpc-web';
|
|
import { Subject } from 'rxjs';
|
|
import { debounceTime, filter, first, take } from 'rxjs/operators';
|
|
import { WarnDialogComponent } from 'src/app/modules/warn-dialog/warn-dialog.component';
|
|
|
|
import { AuthenticationService } from '../authentication.service';
|
|
import { StorageService } from '../storage.service';
|
|
|
|
|
|
const authorizationKey = 'Authorization';
|
|
const bearerPrefix = 'Bearer';
|
|
const accessTokenStorageKey = 'access_token';
|
|
@Injectable({ providedIn: 'root' })
|
|
/**
|
|
* Set the authentication token
|
|
*/
|
|
export class AuthInterceptor<TReq = unknown, TResp = unknown> implements UnaryInterceptor<TReq, TResp> {
|
|
public triggerDialog: Subject<boolean> = new Subject();
|
|
constructor(
|
|
private authenticationService: AuthenticationService,
|
|
private storageService: StorageService,
|
|
private dialog: MatDialog,
|
|
) {
|
|
this.triggerDialog.pipe(debounceTime(1000)).subscribe(() => {
|
|
this.openDialog();
|
|
});
|
|
}
|
|
|
|
public async intercept(request: Request<TReq, TResp>, invoker: any): Promise<UnaryResponse<TReq, TResp>> {
|
|
await this.authenticationService.authenticationChanged.pipe(
|
|
filter((authed) => !!authed),
|
|
first(),
|
|
).toPromise();
|
|
|
|
const metadata = request.getMetadata();
|
|
const accessToken = this.storageService.getItem(accessTokenStorageKey);
|
|
metadata[authorizationKey] = `${bearerPrefix} ${accessToken}`;
|
|
|
|
return invoker(request).then((response: any) => {
|
|
return response;
|
|
}).catch((error: any) => {
|
|
if (error.code === 16) {
|
|
this.triggerDialog.next(true);
|
|
}
|
|
return Promise.reject(error);
|
|
});
|
|
}
|
|
|
|
openDialog() {
|
|
const dialogRef = this.dialog.open(WarnDialogComponent, {
|
|
data: {
|
|
confirmKey: 'ACTIONS.LOGIN',
|
|
titleKey: 'ERRORS.TOKENINVALID.TITLE',
|
|
descriptionKey: 'ERRORS.TOKENINVALID.DESCRIPTION',
|
|
},
|
|
disableClose: true,
|
|
width: '400px',
|
|
});
|
|
|
|
dialogRef.afterClosed().pipe(take(1)).subscribe(resp => {
|
|
if (resp) {
|
|
this.authenticationService.authenticate(undefined, true, true);
|
|
}
|
|
});
|
|
}
|
|
}
|