mirror of
https://github.com/JonasunderscoreJones/accounts.jonasjones.dev.git
synced 2025-10-25 03:49:19 +02:00
CORS header implementation
This commit is contained in:
parent
bd657fc4cb
commit
aae42227f7
1 changed files with 36 additions and 20 deletions
56
src/index.js
56
src/index.js
|
|
@ -1,3 +1,19 @@
|
||||||
|
function corsAccessControlAllowOrigin(request) {
|
||||||
|
if (!request.headers.get('origin')) {
|
||||||
|
return headersCORS
|
||||||
|
}
|
||||||
|
console.log("domain: ", request.headers.get('origin'))
|
||||||
|
const url = new URL(request.headers.get('origin'))
|
||||||
|
const { host } = url
|
||||||
|
if (['localhost:5173'].includes(host)) {
|
||||||
|
let corsHeaders = headersCORS
|
||||||
|
corsHeaders['Access-Control-Allow-Origin'] = host
|
||||||
|
console.log(corsHeaders)
|
||||||
|
return corsHeaders
|
||||||
|
}
|
||||||
|
return headersCORS
|
||||||
|
}
|
||||||
|
|
||||||
const headersCORS = {
|
const headersCORS = {
|
||||||
'Access-Control-Allow-Origin': 'https://dash.jonasjones.dev',
|
'Access-Control-Allow-Origin': 'https://dash.jonasjones.dev',
|
||||||
'Access-Control-Allow-Methods': 'GET, POST, DELETE, OPTIONS',
|
'Access-Control-Allow-Methods': 'GET, POST, DELETE, OPTIONS',
|
||||||
|
|
@ -11,7 +27,7 @@ export default {
|
||||||
const { pathname } = url;
|
const { pathname } = url;
|
||||||
|
|
||||||
if (request.method === 'OPTIONS') {
|
if (request.method === 'OPTIONS') {
|
||||||
return new Response(null, { status: 200, headers: headersCORS });
|
return new Response(null, { status: 200, headers: corsAccessControlAllowOrigin(request) });
|
||||||
}
|
}
|
||||||
|
|
||||||
// Router
|
// Router
|
||||||
|
|
@ -34,7 +50,7 @@ export default {
|
||||||
} else if (pathname === '/session' && request.method === 'GET') {
|
} else if (pathname === '/session' && request.method === 'GET') {
|
||||||
return sessionHealthCheck(request, env);
|
return sessionHealthCheck(request, env);
|
||||||
} else {
|
} else {
|
||||||
return new Response('Not Found', { status: 404, headers: headersCORS });
|
return new Response('Not Found', { status: 404, headers: corsAccessControlAllowOrigin(request) });
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
@ -45,7 +61,7 @@ async function handleLogin(request, env) {
|
||||||
const db = env.DB;
|
const db = env.DB;
|
||||||
|
|
||||||
if (!email || !password) {
|
if (!email || !password) {
|
||||||
return new Response('Bad Request', { status: 400, headers: headersCORS });
|
return new Response('Bad Request', { status: 400, headers: corsAccessControlAllowOrigin(request) });
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check user exists and validate password
|
// Check user exists and validate password
|
||||||
|
|
@ -55,12 +71,12 @@ async function handleLogin(request, env) {
|
||||||
const user = await db.prepare(userQuery).bind(email).first();
|
const user = await db.prepare(userQuery).bind(email).first();
|
||||||
|
|
||||||
if (!user || !user.is_active) {
|
if (!user || !user.is_active) {
|
||||||
return new Response('Invalid email or account inactive.', { status: 403, headers: headersCORS });
|
return new Response('Invalid email or account inactive.', { status: 403, headers: corsAccessControlAllowOrigin(request) });
|
||||||
}
|
}
|
||||||
|
|
||||||
const validPassword = await verifyPassword(password, user.passwordhash);
|
const validPassword = await verifyPassword(password, user.passwordhash);
|
||||||
if (!validPassword) {
|
if (!validPassword) {
|
||||||
return new Response('Invalid credentials.', { status: 403, headers: headersCORS });
|
return new Response('Invalid credentials.', { status: 403, headers: corsAccessControlAllowOrigin(request) });
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create session
|
// Create session
|
||||||
|
|
@ -77,7 +93,7 @@ async function handleLogin(request, env) {
|
||||||
`;
|
`;
|
||||||
await db.prepare(sessionInsert).bind(created, expiration, user.id, sessionKey).run();
|
await db.prepare(sessionInsert).bind(created, expiration, user.id, sessionKey).run();
|
||||||
|
|
||||||
return new Response(JSON.stringify({ sessionKey, expiration }), { status: 200, headers: headersCORS });
|
return new Response(JSON.stringify({ sessionKey, expiration }), { status: 200, headers: corsAccessControlAllowOrigin(request) });
|
||||||
}
|
}
|
||||||
|
|
||||||
async function handleRegister(request, env) {
|
async function handleRegister(request, env) {
|
||||||
|
|
@ -85,7 +101,7 @@ async function handleRegister(request, env) {
|
||||||
const db = env.DB;
|
const db = env.DB;
|
||||||
|
|
||||||
if (!username || !password, !email || !first_name || !last_name) {
|
if (!username || !password, !email || !first_name || !last_name) {
|
||||||
return new Response('Bad Request', { status: 400, headers: headersCORS });
|
return new Response('Bad Request', { status: 400, headers: corsAccessControlAllowOrigin(request) });
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hash password
|
// Hash password
|
||||||
|
|
@ -100,13 +116,13 @@ async function handleRegister(request, env) {
|
||||||
const created = formatDate(new Date());
|
const created = formatDate(new Date());
|
||||||
await db.prepare(insertUser).bind(created, username, passwordHash, email, first_name, last_name).run();
|
await db.prepare(insertUser).bind(created, username, passwordHash, email, first_name, last_name).run();
|
||||||
|
|
||||||
return new Response('User registered successfully.', { status: 201, headers: headersCORS });
|
return new Response('User registered successfully.', { status: 201, headers: corsAccessControlAllowOrigin(request) });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (error.message.includes('UNIQUE')) {
|
if (error.message.includes('UNIQUE')) {
|
||||||
return new Response('Username or email already exists.', { status: 409, headers: headersCORS });
|
return new Response('Username or email already exists.', { status: 409, headers: corsAccessControlAllowOrigin(request) });
|
||||||
}
|
}
|
||||||
console.log(error.message)
|
console.log(error.message)
|
||||||
return new Response('Error registering user.', { status: 500, headers: headersCORS });
|
return new Response('Error registering user.', { status: 500, headers: corsAccessControlAllowOrigin(request) });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -119,13 +135,13 @@ async function handleLogout(request, env) {
|
||||||
`;
|
`;
|
||||||
await db.prepare(deleteSession).bind(sessionKey).run();
|
await db.prepare(deleteSession).bind(sessionKey).run();
|
||||||
|
|
||||||
return new Response('Logged out successfully.', { status: 200, headers: headersCORS });
|
return new Response('Logged out successfully.', { status: 200, headers: corsAccessControlAllowOrigin(request) });
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getAccountData(request, env) {
|
async function getAccountData(request, env) {
|
||||||
const sessionKey = request.headers.get('Authorization')?.replace('Bearer ', '');
|
const sessionKey = request.headers.get('Authorization')?.replace('Bearer ', '');
|
||||||
if (!sessionKey) {
|
if (!sessionKey) {
|
||||||
return new Response('Bad Request', { status: 400, headers: headersCORS });
|
return new Response('Bad Request', { status: 400, headers: corsAccessControlAllowOrigin(request) });
|
||||||
}
|
}
|
||||||
|
|
||||||
const db = env.DB;
|
const db = env.DB;
|
||||||
|
|
@ -139,10 +155,10 @@ async function getAccountData(request, env) {
|
||||||
const account = await db.prepare(accountQuery).bind(sessionKey).first();
|
const account = await db.prepare(accountQuery).bind(sessionKey).first();
|
||||||
|
|
||||||
if (!account) {
|
if (!account) {
|
||||||
return new Response('Unauthorized', { status: 401, headers: headersCORS });
|
return new Response('Unauthorized', { status: 401, headers: corsAccessControlAllowOrigin(request) });
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Response(JSON.stringify(account), { status: 200, headers: headersCORS });
|
return new Response(JSON.stringify(account), { status: 200, headers: corsAccessControlAllowOrigin(request) });
|
||||||
}
|
}
|
||||||
|
|
||||||
async function updateAccountData(request, env) {
|
async function updateAccountData(request, env) {
|
||||||
|
|
@ -151,7 +167,7 @@ async function updateAccountData(request, env) {
|
||||||
const db = env.DB;
|
const db = env.DB;
|
||||||
|
|
||||||
if (!username || !email || !first_name || !last_name || !password) {
|
if (!username || !email || !first_name || !last_name || !password) {
|
||||||
return new Response('Bad Request', { status: 400, headers: headersCORS });
|
return new Response('Bad Request', { status: 400, headers: corsAccessControlAllowOrigin(request) });
|
||||||
}
|
}
|
||||||
|
|
||||||
const passwordHash = await hashPassword(password);
|
const passwordHash = await hashPassword(password);
|
||||||
|
|
@ -165,13 +181,13 @@ async function updateAccountData(request, env) {
|
||||||
`;
|
`;
|
||||||
await db.prepare(updateAccount).bind(username, passwordHash, email, first_name, last_name, sessionKey).run();
|
await db.prepare(updateAccount).bind(username, passwordHash, email, first_name, last_name, sessionKey).run();
|
||||||
|
|
||||||
return new Response('Account updated successfully.', { status: 200, headers: headersCORS });
|
return new Response('Account updated successfully.', { status: 200, headers: corsAccessControlAllowOrigin(request) });
|
||||||
}
|
}
|
||||||
|
|
||||||
async function sessionHealthCheck(request, env) {
|
async function sessionHealthCheck(request, env) {
|
||||||
const sessionKey = request.headers.get('Authorization')?.replace('Bearer ', '');
|
const sessionKey = request.headers.get('Authorization')?.replace('Bearer ', '');
|
||||||
if (!sessionKey) {
|
if (!sessionKey) {
|
||||||
return new Response('Bad Request', { status: 400, headers: headersCORS });
|
return new Response('Bad Request', { status: 400, headers: corsAccessControlAllowOrigin(request) });
|
||||||
}
|
}
|
||||||
|
|
||||||
const db = env.DB;
|
const db = env.DB;
|
||||||
|
|
@ -182,14 +198,14 @@ async function sessionHealthCheck(request, env) {
|
||||||
const session = await db.prepare(sessionQuery).bind(sessionKey).first();
|
const session = await db.prepare(sessionQuery).bind(sessionKey).first();
|
||||||
|
|
||||||
if (!session) {
|
if (!session) {
|
||||||
return new Response(JSON.stringify({ valid: false, error: 'Invalid sessionKey.' }), { status: 401, headers: headersCORS });
|
return new Response(JSON.stringify({ valid: false, error: 'Invalid sessionKey.' }), { status: 401, headers: corsAccessControlAllowOrigin(request) });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (new Date(session.expiration) < new Date()) {
|
if (new Date(session.expiration) < new Date()) {
|
||||||
return new Response(JSON.stringify({ valid: false, error: 'Session expired.' }), { status: 401, headers: headersCORS });
|
return new Response(JSON.stringify({ valid: false, error: 'Session expired.' }), { status: 401, headers: corsAccessControlAllowOrigin(request) });
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Response(JSON.stringify({ valid: true, userId: session.userid }), { status: 200, headers: headersCORS });
|
return new Response(JSON.stringify({ valid: true, userId: session.userid }), { status: 200, headers: corsAccessControlAllowOrigin(request) });
|
||||||
}
|
}
|
||||||
|
|
||||||
// Utility functions
|
// Utility functions
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue