Astro/astro.config.mjs/astro.config.mjs:import vercel from "@astrojs/vercel";
import { defineConfig, envField } from "astro/config";
import { loadEnv } from "vite";
const { BASE_URL, REDIS_URL } = loadEnv(process.env.NODE_ENV, process.cwd(), "");
// https://astro.build/config
export default defineConfig({
output: "server",
adapter: vercel(),
/**
* @link https://docs.astro.build/en/guides/sessions/#configuring-sessions
* @link https://docs.astro.build/en/guides/integrations-guide/vercel/#sessions
* @todo Fix session config by figuring out correct driver / config. Redis seems to be the only option, but it doesn't work with the provided config.
*/
session: {
/** @link https://unstorage.unjs.io/drivers/vercel */
driver: "redis",
options: {
url: REDIS_URL
},
ttl: 60 * 60 * 24 // Results in 1 day
},
/**
* @link https://docs.astro.build/en/guides/environment-variables/#type-safe-environment-variables
* @link https://docs.astro.build/en/guides/environment-variables/#use-variables-from-your-schema
*/
env: {
schema: {
DATABASE_URL: envField.string({
context: "server",
access: "secret",
url: true,
optional: true
}),
DATABASE_TOKEN: envField.string({
context: "server",
access: "secret",
optional: true
}),
DATABASE_FILE: envField.string({
context: "server",
access: "secret",
optional: true,
default: "database.db"
}),
BETTER_AUTH_SECRET: envField.string({
context: "server",
access: "secret"
}),
BETTER_AUTH_URL: envField.string({
context: "server",
access: "secret",
url: true,
optional: true,
startsWith: "http",
default: BASE_URL
}),
REDIS_URL: envField.string({
context: "server",
access: "secret",
url: true,
default: "redis://default:"
})
// ... rest of code
}
}
});import vercel from "@astrojs/vercel";
import { defineConfig, envField } from "astro/config";
import { loadEnv } from "vite";
const { BASE_URL, REDIS_URL } = loadEnv(process.env.NODE_ENV, process.cwd(), "");
// https://astro.build/config
export default defineConfig({
output: "server",
adapter: vercel(),
/**
* @link https://docs.astro.build/en/guides/sessions/#configuring-sessions
* @link https://docs.astro.build/en/guides/integrations-guide/vercel/#sessions
* @todo Fix session config by figuring out correct driver / config. Redis seems to be the only option, but it doesn't work with the provided config.
*/
session: {
/** @link https://unstorage.unjs.io/drivers/vercel */
driver: "redis",
options: {
url: REDIS_URL
},
ttl: 60 * 60 * 24 // Results in 1 day
},
/**
* @link https://docs.astro.build/en/guides/environment-variables/#type-safe-environment-variables
* @link https://docs.astro.build/en/guides/environment-variables/#use-variables-from-your-schema
*/
env: {
schema: {
DATABASE_URL: envField.string({
context: "server",
access: "secret",
url: true,
optional: true
}),
DATABASE_TOKEN: envField.string({
context: "server",
access: "secret",
optional: true
}),
DATABASE_FILE: envField.string({
context: "server",
access: "secret",
optional: true,
default: "database.db"
}),
BETTER_AUTH_SECRET: envField.string({
context: "server",
access: "secret"
}),
BETTER_AUTH_URL: envField.string({
context: "server",
access: "secret",
url: true,
optional: true,
startsWith: "http",
default: BASE_URL
}),
REDIS_URL: envField.string({
context: "server",
access: "secret",
url: true,
default: "redis://default:"
})
// ... rest of code
}
}
});nullnull for authentication checks using isAuthedisAuthed method:/src/middleware.ts/src/middleware.ts:import { auth, authRoot, loginPath } from "@lib/auth";
import type { APIContext } from "astro";
import { defineMiddleware } from "astro:middleware";
export function isAuthed(context: APIContext) {
return auth.api.getSession({
headers: context.request.headers,
});
}
export const onRequest = defineMiddleware(async (context, next) => {
const { pathname } = context.url;
const isLogin = pathname === loginPath;
if ((!isLogin && pathname.startsWith(authRoot)) || pathname.startsWith("/_server-islands/")) {
return next();
}
const authed = await isAuthed(context);
console.log("Session check result:", authed);
if (authed) {
context.locals.user = authed.user;
context.locals.session = authed.session;
} else {
context.locals.user = null;
context.locals.session = null;
if (!isLogin) return context.redirect(loginPath);
}
return next();
});import { auth, authRoot, loginPath } from "@lib/auth";
import type { APIContext } from "astro";
import { defineMiddleware } from "astro:middleware";
export function isAuthed(context: APIContext) {
return auth.api.getSession({
headers: context.request.headers,
});
}
export const onRequest = defineMiddleware(async (context, next) => {
const { pathname } = context.url;
const isLogin = pathname === loginPath;
if ((!isLogin && pathname.startsWith(authRoot)) || pathname.startsWith("/_server-islands/")) {
return next();
}
const authed = await isAuthed(context);
console.log("Session check result:", authed);
if (authed) {
context.locals.user = authed.user;
context.locals.session = authed.session;
} else {
context.locals.user = null;
context.locals.session = null;
if (!isLogin) return context.redirect(loginPath);
}
return next();
});