feat: Security
This commit is contained in:
75
e2e/helpers/auth-api.ts
Normal file
75
e2e/helpers/auth-api.ts
Normal file
@@ -0,0 +1,75 @@
|
||||
import { type APIRequestContext, type Page } from '@playwright/test';
|
||||
|
||||
export const AUTH_TOKENS_STORAGE_KEY = 'metoyou.authTokens';
|
||||
|
||||
export interface AuthSession {
|
||||
id: string;
|
||||
username: string;
|
||||
displayName: string;
|
||||
token: string;
|
||||
expiresAt: number;
|
||||
}
|
||||
|
||||
export function authHeaders(token: string): Record<string, string> {
|
||||
return {
|
||||
Authorization: `Bearer ${token}`,
|
||||
'Content-Type': 'application/json'
|
||||
};
|
||||
}
|
||||
|
||||
export async function registerTestUser(
|
||||
request: APIRequestContext,
|
||||
baseUrl: string,
|
||||
username: string,
|
||||
password: string,
|
||||
displayName?: string
|
||||
): Promise<AuthSession> {
|
||||
const response = await request.post(`${baseUrl}/api/users/register`, {
|
||||
data: {
|
||||
username,
|
||||
password,
|
||||
displayName: displayName ?? username
|
||||
}
|
||||
});
|
||||
|
||||
if (!response.ok()) {
|
||||
throw new Error(`Failed to register test user ${username}: ${response.status()} ${await response.text()}`);
|
||||
}
|
||||
|
||||
return await response.json() as AuthSession;
|
||||
}
|
||||
|
||||
export async function loginTestUser(
|
||||
request: APIRequestContext,
|
||||
baseUrl: string,
|
||||
username: string,
|
||||
password: string
|
||||
): Promise<AuthSession> {
|
||||
const response = await request.post(`${baseUrl}/api/users/login`, {
|
||||
data: { username, password }
|
||||
});
|
||||
|
||||
if (!response.ok()) {
|
||||
throw new Error(`Failed to login test user ${username}: ${response.status()} ${await response.text()}`);
|
||||
}
|
||||
|
||||
return await response.json() as AuthSession;
|
||||
}
|
||||
|
||||
export async function readAuthTokenFromPage(page: Page, serverUrl: string): Promise<string | null> {
|
||||
return await page.evaluate(({ storageKey, url }) => {
|
||||
try {
|
||||
const store = JSON.parse(localStorage.getItem(storageKey) || '{}') as Record<string, { token: string; expiresAt: number }>;
|
||||
const normalizedUrl = url.trim().replace(/\/+$/, '');
|
||||
const entry = store[normalizedUrl];
|
||||
|
||||
if (!entry || entry.expiresAt <= Date.now()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return entry.token;
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}, { storageKey: AUTH_TOKENS_STORAGE_KEY, url: serverUrl });
|
||||
}
|
||||
Reference in New Issue
Block a user