aboutsummaryrefslogtreecommitdiffhomepage
path: root/frontend/app/services/auth.server.ts
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/app/services/auth.server.ts')
-rw-r--r--frontend/app/services/auth.server.ts141
1 files changed, 0 insertions, 141 deletions
diff --git a/frontend/app/services/auth.server.ts b/frontend/app/services/auth.server.ts
deleted file mode 100644
index 144a7cd..0000000
--- a/frontend/app/services/auth.server.ts
+++ /dev/null
@@ -1,141 +0,0 @@
-import { Authenticator } from "remix-auth";
-import { FormStrategy } from "remix-auth-form";
-import { sessionStorage } from "./session.server";
-import { jwtDecode } from "jwt-decode";
-import type { Session } from "@remix-run/server-runtime";
-
-export const authenticator = new Authenticator<string>(sessionStorage);
-
-async function login(username: string, password: string): Promise<string> {
- const res = await fetch(`http://api-server/api/login`, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({ username, password }),
- });
- if (!res.ok) {
- throw new Error("Invalid username or password");
- }
- const user = await res.json();
- return user.token;
-}
-
-authenticator.use(
- new FormStrategy(async ({ form }) => {
- const username = String(form.get("username"));
- const password = String(form.get("password"));
- return await login(username, password);
- }),
- "default",
-);
-
-type JwtPayload = {
- user_id: number;
- username: string;
- display_username: string;
- icon_path: string | null;
- is_admin: boolean;
-};
-
-export type User = {
- userId: number;
- username: string;
- displayUsername: string;
- iconPath: string | null;
- isAdmin: boolean;
-};
-
-export async function isAuthenticated(
- request: Request | Session,
- options?: {
- successRedirect?: never;
- failureRedirect?: never;
- headers?: never;
- },
-): Promise<User | null>;
-export async function isAuthenticated(
- request: Request | Session,
- options: {
- successRedirect: string;
- failureRedirect?: never;
- headers?: HeadersInit;
- },
-): Promise<null>;
-export async function isAuthenticated(
- request: Request | Session,
- options: {
- successRedirect?: never;
- failureRedirect: string;
- headers?: HeadersInit;
- },
-): Promise<User>;
-export async function isAuthenticated(
- request: Request | Session,
- options: {
- successRedirect: string;
- failureRedirect: string;
- headers?: HeadersInit;
- },
-): Promise<null>;
-export async function isAuthenticated(
- request: Request | Session,
- options:
- | {
- successRedirect?: never;
- failureRedirect?: never;
- headers?: never;
- }
- | {
- successRedirect: string;
- failureRedirect?: never;
- headers?: HeadersInit;
- }
- | {
- successRedirect?: never;
- failureRedirect: string;
- headers?: HeadersInit;
- }
- | {
- successRedirect: string;
- failureRedirect: string;
- headers?: HeadersInit;
- } = {},
-): Promise<User | null> {
- let jwt;
-
- // This function's signature should be compatible with `authenticator.isAuthenticated` but TypeScript does not infer it correctly.
- const { successRedirect, failureRedirect, headers } = options;
- if (successRedirect && failureRedirect) {
- jwt = await authenticator.isAuthenticated(request, {
- successRedirect,
- failureRedirect,
- headers,
- });
- } else if (!successRedirect && failureRedirect) {
- jwt = await authenticator.isAuthenticated(request, {
- failureRedirect,
- headers,
- });
- } else if (successRedirect && !failureRedirect) {
- jwt = await authenticator.isAuthenticated(request, {
- successRedirect,
- headers,
- });
- } else {
- jwt = await authenticator.isAuthenticated(request);
- }
-
- if (!jwt) {
- return null;
- }
- // TODO: runtime type check
- const payload = jwtDecode<JwtPayload>(jwt);
- return {
- userId: payload.user_id,
- username: payload.username,
- displayUsername: payload.display_username,
- iconPath: payload.icon_path,
- isAdmin: payload.is_admin,
- };
-}