From a02801c0c8927f04b030380c505ff9ab01cc3c78 Mon Sep 17 00:00:00 2001 From: Francesco Minnocci Date: Fri, 6 Jun 2025 20:21:30 +0200 Subject: [PATCH] feat: add backend for auth with better-auth --- astro.config.mjs | 12 +- bun.lockb | Bin 340650 -> 395874 bytes drizzle.config.ts | 11 + drizzle/0000_violet_agent_zero.sql | 82 +++++ drizzle/meta/0000_snapshot.json | 555 +++++++++++++++++++++++++++++ drizzle/meta/_journal.json | 13 + package.json | 6 + src/auth.ts | 28 ++ src/client/auth-client.ts | 5 + src/db/auth-schema.ts | 57 +++ src/db/index.ts | 4 + src/db/schema.ts | 33 ++ src/env.d.ts | 8 + src/middleware.ts | 18 + src/pages/api/auth/[...all].ts | 8 + src/pages/login.astro | 9 + src/pages/profilo.astro | 12 + 17 files changed, 860 insertions(+), 1 deletion(-) create mode 100644 drizzle.config.ts create mode 100644 drizzle/0000_violet_agent_zero.sql create mode 100644 drizzle/meta/0000_snapshot.json create mode 100644 drizzle/meta/_journal.json create mode 100644 src/auth.ts create mode 100644 src/client/auth-client.ts create mode 100644 src/db/auth-schema.ts create mode 100644 src/db/index.ts create mode 100644 src/db/schema.ts create mode 100644 src/middleware.ts create mode 100644 src/pages/api/auth/[...all].ts create mode 100644 src/pages/profilo.astro diff --git a/astro.config.mjs b/astro.config.mjs index 2200e93..a7248d8 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -6,20 +6,25 @@ import remarkMath from 'remark-math' import yaml from '@rollup/plugin-yaml' +import node from '@astrojs/node' + // https://astro.build/config export default defineConfig({ vite: { plugins: [yaml()], }, + server: { port: 3000, }, + markdown: { remarkPlugins: [remarkMath], shikiConfig: { theme: 'github-light', }, }, + integrations: [ preact({ compat: true, @@ -28,5 +33,10 @@ export default defineConfig({ remarkPlugins: [remarkMath], }), ], - output: 'static', + + output: 'server', + + adapter: node({ + mode: 'standalone', + }), }) diff --git a/bun.lockb b/bun.lockb index a74191b75baa2cdc23a8efb557d8e7db9ff3a9e8..507ac3ec413b4a28cb1d272985ac6f05f752011e 100755 GIT binary patch delta 99379 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 QuyLbOV!OfL^^1!C2ZvWdF#rGn delta 67990 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 statement-breakpoint +CREATE TABLE `appunti` ( + `user_id` text, + `hash` text NOT NULL, + `link` text, + `visibility` text NOT NULL, + `title` text NOT NULL, + `description` text, + `tags` text NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `poisson_requests` ( + `user_id` text, + `request_type` text NOT NULL, + `comments` text, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `users` ( + `id` text, + `username` text NOT NULL, + `full_name` text, + `email` text, + FOREIGN KEY (`id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `account` ( + `id` text PRIMARY KEY NOT NULL, + `account_id` text NOT NULL, + `provider_id` text NOT NULL, + `user_id` text NOT NULL, + `access_token` text, + `refresh_token` text, + `id_token` text, + `access_token_expires_at` integer, + `refresh_token_expires_at` integer, + `scope` text, + `password` text, + `created_at` integer NOT NULL, + `updated_at` integer NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade +); +--> statement-breakpoint +CREATE TABLE `session` ( + `id` text PRIMARY KEY NOT NULL, + `expires_at` integer NOT NULL, + `token` text NOT NULL, + `created_at` integer NOT NULL, + `updated_at` integer NOT NULL, + `ip_address` text, + `user_agent` text, + `user_id` text NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade +); +--> statement-breakpoint +CREATE UNIQUE INDEX `session_token_unique` ON `session` (`token`);--> statement-breakpoint +CREATE TABLE `user` ( + `id` text PRIMARY KEY NOT NULL, + `name` text NOT NULL, + `email` text NOT NULL, + `email_verified` integer NOT NULL, + `image` text, + `created_at` integer NOT NULL, + `updated_at` integer NOT NULL +); +--> statement-breakpoint +CREATE UNIQUE INDEX `user_email_unique` ON `user` (`email`);--> statement-breakpoint +CREATE TABLE `verification` ( + `id` text PRIMARY KEY NOT NULL, + `identifier` text NOT NULL, + `value` text NOT NULL, + `expires_at` integer NOT NULL, + `created_at` integer, + `updated_at` integer +); diff --git a/drizzle/meta/0000_snapshot.json b/drizzle/meta/0000_snapshot.json new file mode 100644 index 0000000..7c6944a --- /dev/null +++ b/drizzle/meta/0000_snapshot.json @@ -0,0 +1,555 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "84352768-6c24-4412-9d9e-8a3c756d31b1", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "accounts": { + "name": "accounts", + "columns": { + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "accounts_user_id_user_id_fk": { + "name": "accounts_user_id_user_id_fk", + "tableFrom": "accounts", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "appunti": { + "name": "appunti", + "columns": { + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "hash": { + "name": "hash", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "link": { + "name": "link", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "visibility": { + "name": "visibility", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "tags": { + "name": "tags", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "appunti_user_id_users_id_fk": { + "name": "appunti_user_id_users_id_fk", + "tableFrom": "appunti", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "poisson_requests": { + "name": "poisson_requests", + "columns": { + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "request_type": { + "name": "request_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "comments": { + "name": "comments", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "poisson_requests_user_id_users_id_fk": { + "name": "poisson_requests_user_id_users_id_fk", + "tableFrom": "poisson_requests", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "users": { + "name": "users", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "full_name": { + "name": "full_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "users_id_user_id_fk": { + "name": "users_id_user_id_fk", + "tableFrom": "users", + "tableTo": "user", + "columnsFrom": [ + "id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "account": { + "name": "account", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "account_id": { + "name": "account_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider_id": { + "name": "provider_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "refresh_token": { + "name": "refresh_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "id_token": { + "name": "id_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "access_token_expires_at": { + "name": "access_token_expires_at", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "refresh_token_expires_at": { + "name": "refresh_token_expires_at", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": { + "account_user_id_user_id_fk": { + "name": "account_user_id_user_id_fk", + "tableFrom": "account", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "session": { + "name": "session", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "ip_address": { + "name": "ip_address", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "user_agent": { + "name": "user_agent", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "session_token_unique": { + "name": "session_token_unique", + "columns": [ + "token" + ], + "isUnique": true + } + }, + "foreignKeys": { + "session_user_id_user_id_fk": { + "name": "session_user_id_user_id_fk", + "tableFrom": "session", + "tableTo": "user", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "user": { + "name": "user", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "user_email_unique": { + "name": "user_email_unique", + "columns": [ + "email" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "verification": { + "name": "verification", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "updated_at": { + "name": "updated_at", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json new file mode 100644 index 0000000..913f43e --- /dev/null +++ b/drizzle/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "7", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "6", + "when": 1749233567397, + "tag": "0000_violet_agent_zero", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/package.json b/package.json index bf80598..8aa0c01 100644 --- a/package.json +++ b/package.json @@ -20,11 +20,16 @@ "@fontsource/source-code-pro": "^5.0.16", "@fontsource/source-sans-pro": "^5.0.8", "@fontsource/space-mono": "^5.0.20", + "@libsql/client": "^0.15.8", "@phosphor-icons/core": "^2.1.1", "@phosphor-icons/react": "^2.1.7", "@preact/signals": "^1.3.0", "@types/jsdom": "^21.1.7", "astro": "5.1.0", + "better-auth": "^1.2.8", + "better-sqlite3": "^11.10.0", + "dotenv": "^16.5.0", + "drizzle-orm": "^0.44.2", "fuse.js": "^7.0.0", "katex": "^0.16.9", "lucide-static": "^0.468.0", @@ -36,6 +41,7 @@ "@astrojs/mdx": "4.0.2", "@rollup/plugin-yaml": "^4.1.2", "@types/katex": "^0.16.7", + "drizzle-kit": "^0.31.1", "jsdom": "^24.1.1", "linkedom": "^0.18.4", "npm-run-all": "^4.1.5", diff --git a/src/auth.ts b/src/auth.ts new file mode 100644 index 0000000..bfde777 --- /dev/null +++ b/src/auth.ts @@ -0,0 +1,28 @@ +import { betterAuth } from 'better-auth' +import { genericOAuth } from 'better-auth/plugins' +import { drizzleAdapter } from 'better-auth/adapters/drizzle' +import * as authSchema from '@/db/auth-schema' +import db from '@/db' + +export const auth = betterAuth({ + database: drizzleAdapter(db, { + provider: 'sqlite', + schema: authSchema, + }), + plugins: [ + genericOAuth({ + config: [ + { + providerId: 'unipi', + clientId: process.env.OAUTH_CLIENT_ID!, + clientSecret: process.env.OAUTH_CLIENT_SECRET!, + scopes: process.env.OAUTH_SCOPES!.split(' '), + userInfoUrl: process.env.OAUTH_USER_INFO_URL!, + authorizationUrl: process.env.OAUTH_AUTH_URL!, + tokenUrl: `${process.env.OAUTH_TOKEN_HOST}${process.env.OAUTH_TOKEN_PATH}`, + redirectURI: process.env.OAUTH_REDIRECT_URL!, + }, + ], + }), + ], +}) diff --git a/src/client/auth-client.ts b/src/client/auth-client.ts new file mode 100644 index 0000000..a134d33 --- /dev/null +++ b/src/client/auth-client.ts @@ -0,0 +1,5 @@ +import { createAuthClient } from 'better-auth/client' +import { genericOAuthClient } from 'better-auth/client/plugins' +export const authClient = createAuthClient({ + plugins: [genericOAuthClient()], +}) diff --git a/src/db/auth-schema.ts b/src/db/auth-schema.ts new file mode 100644 index 0000000..f527aa8 --- /dev/null +++ b/src/db/auth-schema.ts @@ -0,0 +1,57 @@ +import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core' + +export const user = sqliteTable('user', { + id: text('id').primaryKey(), + name: text('name').notNull(), + email: text('email').notNull().unique(), + emailVerified: integer('email_verified', { mode: 'boolean' }) + .$defaultFn(() => false) + .notNull(), + image: text('image'), + createdAt: integer('created_at', { mode: 'timestamp' }) + .$defaultFn(() => /* @__PURE__ */ new Date()) + .notNull(), + updatedAt: integer('updated_at', { mode: 'timestamp' }) + .$defaultFn(() => /* @__PURE__ */ new Date()) + .notNull(), +}) + +export const session = sqliteTable('session', { + id: text('id').primaryKey(), + expiresAt: integer('expires_at', { mode: 'timestamp' }).notNull(), + token: text('token').notNull().unique(), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull(), + updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull(), + ipAddress: text('ip_address'), + userAgent: text('user_agent'), + userId: text('user_id') + .notNull() + .references(() => user.id, { onDelete: 'cascade' }), +}) + +export const account = sqliteTable('account', { + id: text('id').primaryKey(), + accountId: text('account_id').notNull(), + providerId: text('provider_id').notNull(), + userId: text('user_id') + .notNull() + .references(() => user.id, { onDelete: 'cascade' }), + accessToken: text('access_token'), + refreshToken: text('refresh_token'), + idToken: text('id_token'), + accessTokenExpiresAt: integer('access_token_expires_at', { mode: 'timestamp' }), + refreshTokenExpiresAt: integer('refresh_token_expires_at', { mode: 'timestamp' }), + scope: text('scope'), + password: text('password'), + createdAt: integer('created_at', { mode: 'timestamp' }).notNull(), + updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull(), +}) + +export const verification = sqliteTable('verification', { + id: text('id').primaryKey(), + identifier: text('identifier').notNull(), + value: text('value').notNull(), + expiresAt: integer('expires_at', { mode: 'timestamp' }).notNull(), + createdAt: integer('created_at', { mode: 'timestamp' }).$defaultFn(() => /* @__PURE__ */ new Date()), + updatedAt: integer('updated_at', { mode: 'timestamp' }).$defaultFn(() => /* @__PURE__ */ new Date()), +}) diff --git a/src/db/index.ts b/src/db/index.ts new file mode 100644 index 0000000..a3ce19f --- /dev/null +++ b/src/db/index.ts @@ -0,0 +1,4 @@ +import 'dotenv/config' +import { drizzle } from 'drizzle-orm/libsql' + +export default drizzle(process.env.DB_FILE_NAME!) diff --git a/src/db/schema.ts b/src/db/schema.ts new file mode 100644 index 0000000..c5315bf --- /dev/null +++ b/src/db/schema.ts @@ -0,0 +1,33 @@ +import { sqliteTable, text } from 'drizzle-orm/sqlite-core' +export * from './auth-schema' + +import { user } from './auth-schema' + +export const usersTable = sqliteTable('users', { + id: text('id').references(() => user.id), + username: text('username').notNull(), + fullName: text('full_name'), + email: text('email'), +}) + +export const accountsTable = sqliteTable('accounts', { + userId: text('user_id').references(() => user.id), + provider: text('provider').notNull(), + username: text('username').notNull(), +}) + +export const poissonRequestsTable = sqliteTable('poisson_requests', { + userId: text('user_id').references(() => usersTable.id), + requestType: text('request_type').notNull(), // "link" or "create" + comments: text('comments'), // contains username suggestions +}) + +export const appuntiTable = sqliteTable('appunti', { + userId: text('user_id').references(() => usersTable.id), + hash: text('hash').notNull(), + link: text('link'), + visibility: text('visibility').notNull(), // "public", "internal", "private" + title: text('title').notNull(), + description: text('description'), + tags: text('tags').notNull(), // Array of strings, e.g. ["#geometria-2", "#511aa", "#2017-18", "#frigerio"] +}) diff --git a/src/env.d.ts b/src/env.d.ts index acef35f..7691f9f 100644 --- a/src/env.d.ts +++ b/src/env.d.ts @@ -1,2 +1,10 @@ /// /// + +declare namespace App { + // Note: 'import {} from ""' syntax does not work in .d.ts files. + interface Locals { + user: import('better-auth').User | null + session: import('better-auth').Session | null + } +} diff --git a/src/middleware.ts b/src/middleware.ts new file mode 100644 index 0000000..e5f1b1f --- /dev/null +++ b/src/middleware.ts @@ -0,0 +1,18 @@ +import { auth } from '@/auth' +import { defineMiddleware } from 'astro:middleware' + +export const onRequest = defineMiddleware(async (context, next) => { + const isAuthed = await auth.api.getSession({ + headers: context.request.headers, + }) + + if (isAuthed) { + context.locals.user = isAuthed.user + context.locals.session = isAuthed.session + } else { + context.locals.user = null + context.locals.session = null + } + + return next() +}) diff --git a/src/pages/api/auth/[...all].ts b/src/pages/api/auth/[...all].ts new file mode 100644 index 0000000..04b18eb --- /dev/null +++ b/src/pages/api/auth/[...all].ts @@ -0,0 +1,8 @@ +import { auth } from '@/auth' +import type { APIRoute } from 'astro' + +export const ALL: APIRoute = async ctx => { + // If you want to use rate limiting, make sure to set the 'x-forwarded-for' header to the request headers from the context + // ctx.request.headers.set("x-forwarded-for", ctx.clientAddress); + return auth.handler(ctx.request) +} diff --git a/src/pages/login.astro b/src/pages/login.astro index 7a2a4a0..fbbf60a 100644 --- a/src/pages/login.astro +++ b/src/pages/login.astro @@ -19,4 +19,13 @@ import PageLayout from '../layouts/PageLayout.astro' Login + + diff --git a/src/pages/profilo.astro b/src/pages/profilo.astro new file mode 100644 index 0000000..55bc529 --- /dev/null +++ b/src/pages/profilo.astro @@ -0,0 +1,12 @@ +--- +const session = () => { + if (Astro.locals.session) { + return Astro.locals.session + } else { + // Redirect to login page if the user is not authenticated + return Astro.redirect('/login') + } +} +--- + +Ciao prova profilo {JSON.stringify(Astro.locals.user)}