195 lines
4.1 KiB
TypeScript
195 lines
4.1 KiB
TypeScript
import { APIClient } from "./ApiClient";
|
|
|
|
export enum CreateAccountResult {
|
|
TooManyRequests,
|
|
BadInputData,
|
|
MailAlreadyExists,
|
|
Success,
|
|
Error,
|
|
}
|
|
|
|
export enum PasswordLoginResult {
|
|
TooManyRequests,
|
|
InvalidCredentials,
|
|
Success,
|
|
Error,
|
|
}
|
|
|
|
export interface CheckResetTokenResponse {
|
|
name: string;
|
|
}
|
|
|
|
const TokenStateKey = "auth-token";
|
|
|
|
export class AuthApi {
|
|
/**
|
|
* Check out whether user is signed in or not
|
|
*/
|
|
static get SignedIn(): boolean {
|
|
return localStorage.getItem(TokenStateKey) !== null;
|
|
}
|
|
|
|
/**
|
|
* Get user auth token
|
|
*/
|
|
static get AuthToken(): string {
|
|
if (!this.SignedIn) throw new Error("User is not authenticated!");
|
|
return localStorage.getItem(TokenStateKey)!;
|
|
}
|
|
|
|
/**
|
|
* Create a new account
|
|
*/
|
|
static async CreateAccount(
|
|
name: string,
|
|
mail: string
|
|
): Promise<CreateAccountResult> {
|
|
const res = await APIClient.exec({
|
|
uri: "/auth/create_account",
|
|
method: "POST",
|
|
allowFail: true,
|
|
jsonData: {
|
|
name: name,
|
|
email: mail,
|
|
},
|
|
});
|
|
|
|
switch (res.status) {
|
|
case 429:
|
|
return CreateAccountResult.TooManyRequests;
|
|
case 400:
|
|
return CreateAccountResult.BadInputData;
|
|
case 409:
|
|
return CreateAccountResult.MailAlreadyExists;
|
|
case 200:
|
|
case 201:
|
|
return CreateAccountResult.Success;
|
|
default:
|
|
return CreateAccountResult.Error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Authenticate using an email and a password
|
|
*
|
|
* @param mail The email address to use
|
|
* @param password The password to use
|
|
*/
|
|
static async LoginWithPassword(
|
|
mail: string,
|
|
password: string
|
|
): Promise<PasswordLoginResult> {
|
|
const res = await APIClient.exec({
|
|
uri: "/auth/password_login",
|
|
method: "POST",
|
|
allowFail: true,
|
|
jsonData: {
|
|
mail: mail,
|
|
password: password,
|
|
},
|
|
});
|
|
|
|
switch (res.status) {
|
|
case 429:
|
|
return PasswordLoginResult.TooManyRequests;
|
|
case 401:
|
|
return PasswordLoginResult.InvalidCredentials;
|
|
case 200:
|
|
case 201:
|
|
localStorage.setItem(TokenStateKey, res.data.token);
|
|
return PasswordLoginResult.Success;
|
|
default:
|
|
return PasswordLoginResult.Error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Start OpenID login
|
|
*
|
|
* @param id The ID of the OIDC provider to use
|
|
*/
|
|
static async StartOpenIDLogin(id: string): Promise<{ url: string }> {
|
|
return (
|
|
await APIClient.exec({
|
|
uri: "/auth/start_openid_login",
|
|
method: "POST",
|
|
jsonData: { provider: id },
|
|
})
|
|
).data;
|
|
}
|
|
|
|
/**
|
|
* Finish OpenID login
|
|
*/
|
|
static async FinishOpenIDLogin(code: string, state: string): Promise<void> {
|
|
const res: { user_id: number; token: string } = (
|
|
await APIClient.exec({
|
|
uri: "/auth/finish_openid_login",
|
|
method: "POST",
|
|
jsonData: { code: code, state: state },
|
|
})
|
|
).data;
|
|
|
|
localStorage.setItem(TokenStateKey, res.token);
|
|
}
|
|
|
|
/**
|
|
* Sign out
|
|
*/
|
|
static async SignOut(): Promise<void> {
|
|
await APIClient.exec({
|
|
uri: "/auth/logout",
|
|
method: "GET",
|
|
});
|
|
|
|
this.RemoveAuthToken();
|
|
}
|
|
|
|
/**
|
|
* Remove auth token from storage
|
|
*/
|
|
static RemoveAuthToken() {
|
|
localStorage.removeItem(TokenStateKey);
|
|
}
|
|
|
|
/**
|
|
* Request to reset password
|
|
*/
|
|
static async RequestResetPassword(mail: string): Promise<void> {
|
|
await APIClient.exec({
|
|
uri: "/auth/request_reset_password",
|
|
method: "POST",
|
|
jsonData: { mail: mail },
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Check reset password token
|
|
*/
|
|
static async CheckResetPasswordToken(
|
|
token: string
|
|
): Promise<CheckResetTokenResponse> {
|
|
return (
|
|
await APIClient.exec({
|
|
uri: "/auth/check_reset_password_token",
|
|
method: "POST",
|
|
jsonData: { token: token },
|
|
})
|
|
).data;
|
|
}
|
|
|
|
/**
|
|
* Reset password
|
|
*/
|
|
static async ResetPassword(
|
|
token: string,
|
|
newPassword: string
|
|
): Promise<void> {
|
|
await APIClient.exec({
|
|
uri: "/auth/reset_password",
|
|
method: "POST",
|
|
jsonData: { token: token, password: newPassword },
|
|
});
|
|
}
|
|
}
|