stages: add WebAuthn stage (#550)
* core: add User.uid for globally unique user ID * admin: fix ?next for Flow list * stages: add initial webauthn implementation * web: add ak-flow-submit event to submit flow stage * web: show error message for webauthn registration * admin: fix next param not redirecting correctly * stages/webauthn: remove form * stages/webauthn: add API * web: update flow diagram on ak-refresh * stages/webauthn: add initial authentication * stages/webauthn: initial authentication implementation * web: cleanup webauthn utils * stages: rename otp_* to authenticator and move webauthn to authenticator * docs: fix broken links * stages/authenticator_*: fix template paths * stages/authenticator_validate: add device classes * stages/authenticator_webauthn: implement django_otp.devices * stages/authenticator_*: update default stage names * web: add button to create stage on flow page * web: don't minify HTML, remove nbsp * admin: fix typo in stage list * stages/*: use common base class for stage serializer * stages/authenticator_*: create default objects after rename * tests/e2e: adjust stage order
This commit is contained in:
@ -49,7 +49,7 @@ export class Client {
|
||||
.then((r) => <T>r);
|
||||
}
|
||||
|
||||
update<T>(url: string[], body: T, query?: QueryArguments): Promise<T> {
|
||||
private writeRequest<T>(url: string[], body: T, method: string, query?: QueryArguments): Promise<T> {
|
||||
const finalUrl = this.makeUrl(url, query);
|
||||
const csrftoken = getCookie("authentik_csrf");
|
||||
const request = new Request(finalUrl, {
|
||||
@ -57,10 +57,10 @@ export class Client {
|
||||
"Accept": "application/json",
|
||||
"Content-Type": "application/json",
|
||||
"X-CSRFToken": csrftoken,
|
||||
},
|
||||
},
|
||||
});
|
||||
return fetch(request, {
|
||||
method: "PATCH",
|
||||
method: method,
|
||||
mode: "same-origin",
|
||||
body: JSON.stringify(body),
|
||||
})
|
||||
@ -78,6 +78,10 @@ export class Client {
|
||||
.then((r) => r.json())
|
||||
.then((r) => <T>r);
|
||||
}
|
||||
|
||||
update<T>(url: string[], body: T, query?: QueryArguments): Promise<T> {
|
||||
return this.writeRequest(url, body, "PATCH", query);
|
||||
}
|
||||
}
|
||||
|
||||
export const DefaultClient = new Client();
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
import { DefaultClient, AKResponse, QueryArguments } from "./Client";
|
||||
import { TypeCreate } from "./Providers";
|
||||
|
||||
export enum FlowDesignation {
|
||||
Authentication = "authentication",
|
||||
@ -57,6 +58,14 @@ export class Stage {
|
||||
constructor() {
|
||||
throw Error();
|
||||
}
|
||||
|
||||
static getTypes(): Promise<TypeCreate[]> {
|
||||
return DefaultClient.fetch<TypeCreate[]>(["stages", "all", "types"]);
|
||||
}
|
||||
|
||||
static adminUrl(rest: string): string {
|
||||
return `/administration/stages/${rest}`;
|
||||
}
|
||||
}
|
||||
|
||||
export class FlowStageBinding {
|
||||
|
||||
Reference in New Issue
Block a user