diff --git a/solidstart/github-oauth/package.json b/solidstart/github-oauth/package.json index 5d4fb5e..0da6b99 100644 --- a/solidstart/github-oauth/package.json +++ b/solidstart/github-oauth/package.json @@ -7,19 +7,20 @@ "start": "node ./.output/server/index.mjs" }, "dependencies": { - "@lucia-auth/adapter-sqlite": "^3.0.0", - "@solidjs/router": "^0.10.5", - "@solidjs/start": "^0.4.2", - "arctic": "^0.10.2", - "better-sqlite3": "^9.2.2", - "lucia": "^3.2.0", - "solid-js": "^1.8.7", - "vinxi": "0.0.54" + "@lucia-auth/adapter-sqlite": "^3.0.2", + "@solidjs/router": "^0.14.10", + "@solidjs/start": "^1.0.9", + "arctic": "^1.9.2", + "better-sqlite3": "^9.6.0", + "lucia": "^3.2.1", + "solid-js": "^1.9.2", + "vinxi": "^0.4.3" }, "engines": { "node": ">=18" }, "devDependencies": { - "@types/better-sqlite3": "^7.6.8" + "@types/better-sqlite3": "^7.6.8", + "typescript": "^5.6.3" } } diff --git a/solidstart/github-oauth/src/app.tsx b/solidstart/github-oauth/src/app.tsx index 9648928..e6770ce 100644 --- a/solidstart/github-oauth/src/app.tsx +++ b/solidstart/github-oauth/src/app.tsx @@ -1,5 +1,5 @@ import { Router } from "@solidjs/router"; -import { FileRoutes } from "@solidjs/start"; +import { FileRoutes } from "@solidjs/start/router"; import { Suspense } from "solid-js"; export default function App() { diff --git a/solidstart/github-oauth/src/entry-client.tsx b/solidstart/github-oauth/src/entry-client.tsx index e10a0fd..93211d7 100644 --- a/solidstart/github-oauth/src/entry-client.tsx +++ b/solidstart/github-oauth/src/entry-client.tsx @@ -1,3 +1,3 @@ import { mount, StartClient } from "@solidjs/start/client"; -mount(() => , document.getElementById("app")); +mount(() => , document.getElementById("app")!); diff --git a/solidstart/github-oauth/src/lib/utils.ts b/solidstart/github-oauth/src/lib/utils.ts index 2404ca9..65a06b0 100644 --- a/solidstart/github-oauth/src/lib/utils.ts +++ b/solidstart/github-oauth/src/lib/utils.ts @@ -4,8 +4,8 @@ import { getRequestEvent } from "solid-js/web"; export const getAuthenticatedUser = cache(async () => { "use server"; const event = getRequestEvent()!; - if (!event.context.user) { + if (!event.locals.user) { throw redirect("/login"); } - return event.context.user; + return event.locals.user; }, "user"); diff --git a/solidstart/github-oauth/src/middleware.ts b/solidstart/github-oauth/src/middleware.ts index 11563dd..8901656 100644 --- a/solidstart/github-oauth/src/middleware.ts +++ b/solidstart/github-oauth/src/middleware.ts @@ -1,39 +1,41 @@ -import { createMiddleware, appendHeader, getCookie, getHeader } from "@solidjs/start/server"; +import { createMiddleware} from "@solidjs/start/middleware"; import { Session, User, verifyRequestOrigin } from "lucia"; import { lucia } from "./lib/auth"; +import { appendHeader, getCookie, getHeader } from "vinxi/http"; +import { FetchEvent } from "@solidjs/start/server"; export default createMiddleware({ - onRequest: async (event) => { - if (event.node.req.method !== "GET") { - const originHeader = getHeader(event, "Origin") ?? null; - const hostHeader = getHeader(event, "Host") ?? null; + onRequest: [ async (event: FetchEvent) => { + if (event.request.method !== "GET") { + const originHeader = getHeader("Origin") ?? null; + const hostHeader = getHeader( "Host") ?? null; if (!originHeader || !hostHeader || !verifyRequestOrigin(originHeader, [hostHeader])) { - event.node.res.writeHead(403).end(); + event.response.status = 403; return; } } - const sessionId = getCookie(event, lucia.sessionCookieName) ?? null; + const sessionId = getCookie(lucia.sessionCookieName) ?? null; if (!sessionId) { - event.context.session = null; - event.context.user = null; + event.locals.session = null; + event.locals.user = null; return; } const { session, user } = await lucia.validateSession(sessionId); if (session && session.fresh) { - appendHeader(event, "Set-Cookie", lucia.createSessionCookie(session.id).serialize()); + appendHeader("Set-Cookie", lucia.createSessionCookie(session.id).serialize()); } if (!session) { - appendHeader(event, "Set-Cookie", lucia.createBlankSessionCookie().serialize()); + appendHeader("Set-Cookie", lucia.createBlankSessionCookie().serialize()); } - event.context.session = session; - event.context.user = user; - } + event.locals.session = session; + event.locals.user = user; + }] }); -declare module "vinxi/server" { - interface H3EventContext { +declare module "@solidjs/start/server" { + interface RequestEventLocals { user: User | null; session: Session | null; } diff --git a/solidstart/github-oauth/src/routes/index.tsx b/solidstart/github-oauth/src/routes/index.tsx index 2a910d9..549842c 100644 --- a/solidstart/github-oauth/src/routes/index.tsx +++ b/solidstart/github-oauth/src/routes/index.tsx @@ -1,11 +1,11 @@ import { action, createAsync, redirect } from "@solidjs/router"; import { getRequestEvent } from "solid-js/web"; -import { appendHeader } from "@solidjs/start/server"; +import { appendHeader } from "vinxi/http"; import { lucia } from "~/lib/auth"; import { getAuthenticatedUser } from "~/lib/utils"; export default function Index() { - const user = createAsync(getAuthenticatedUser); + const user = createAsync(() => getAuthenticatedUser()); return ( <>

Hi, {user()?.username}!

@@ -20,10 +20,10 @@ export default function Index() { const logout = action(async () => { "use server"; const event = getRequestEvent()!; - if (!event.context.session) { + if (!event.locals.session) { return new Error("Unauthorized"); } - await lucia.invalidateSession(event.context.session.id); - appendHeader(event, "Set-Cookie", lucia.createBlankSessionCookie().serialize()); + await lucia.invalidateSession(event.locals.session.id); + appendHeader("Set-Cookie", lucia.createBlankSessionCookie().serialize()); throw redirect("/login"); }); diff --git a/solidstart/github-oauth/src/routes/login/github/callback.ts b/solidstart/github-oauth/src/routes/login/github/callback.ts index c607a1c..7c3446f 100644 --- a/solidstart/github-oauth/src/routes/login/github/callback.ts +++ b/solidstart/github-oauth/src/routes/login/github/callback.ts @@ -1,23 +1,15 @@ -import { - getQuery, - createError, - getCookie, - appendHeader, - sendRedirect -} from "@solidjs/start/server"; import { OAuth2RequestError } from "arctic"; import { generateId } from "lucia"; import { github, lucia } from "~/lib/auth"; import { db } from "~/lib/db"; - -import type { APIEvent } from "@solidjs/start/server"; import type { DatabaseUser } from "~/lib/db"; +import { appendHeader, createError, getCookie, getQuery, HTTPEvent, sendRedirect } from "vinxi/http"; -export async function GET(event: APIEvent) { +export async function GET(event: HTTPEvent) { const query = getQuery(event); const code = query.code?.toString() ?? null; const state = query.state?.toString() ?? null; - const storedState = getCookie(event, "github_oauth_state") ?? null; + const storedState = getCookie("github_oauth_state") ?? null; if (!code || !state || !storedState || state !== storedState) { throw createError({ status: 400 @@ -38,8 +30,8 @@ export async function GET(event: APIEvent) { if (existingUser) { const session = await lucia.createSession(existingUser.id, {}); - appendHeader(event, "Set-Cookie", lucia.createSessionCookie(session.id).serialize()); - return sendRedirect(event, "/"); + appendHeader("Set-Cookie", lucia.createSessionCookie(session.id).serialize()); + return sendRedirect("/"); } const userId = generateId(15); @@ -49,8 +41,8 @@ export async function GET(event: APIEvent) { githubUser.login ); const session = await lucia.createSession(userId, {}); - appendHeader(event, "Set-Cookie", lucia.createSessionCookie(session.id).serialize()); - return sendRedirect(event, "/"); + appendHeader("Set-Cookie", lucia.createSessionCookie(session.id).serialize()); + return sendRedirect("/"); } catch (e) { if (e instanceof OAuth2RequestError && e.message === "bad_verification_code") { // invalid code diff --git a/solidstart/github-oauth/src/routes/login/github/index.ts b/solidstart/github-oauth/src/routes/login/github/index.ts index aad0c99..9c76e63 100644 --- a/solidstart/github-oauth/src/routes/login/github/index.ts +++ b/solidstart/github-oauth/src/routes/login/github/index.ts @@ -1,4 +1,4 @@ -import { sendRedirect, setCookie } from "@solidjs/start/server"; +import { sendRedirect, setCookie } from "vinxi/http"; import { generateState } from "arctic"; import { github } from "~/lib/auth"; @@ -8,12 +8,12 @@ export async function GET(event: APIEvent) { const state = generateState(); const url = await github.createAuthorizationURL(state); - setCookie(event, "github_oauth_state", state, { + setCookie("github_oauth_state", state, { path: "/", secure: process.env.NODE_ENV === "production", httpOnly: true, maxAge: 60 * 10, sameSite: "lax" }); - return sendRedirect(event, url.toString()); + return sendRedirect(url.toString()); } diff --git a/solidstart/github-oauth/vite.config.ts b/solidstart/github-oauth/vite.config.ts index db26772..bb4c908 100644 --- a/solidstart/github-oauth/vite.config.ts +++ b/solidstart/github-oauth/vite.config.ts @@ -1,7 +1,5 @@ import { defineConfig } from "@solidjs/start/config"; export default defineConfig({ - start: { - middleware: "./src/middleware.ts" - } + middleware: "./src/middleware.ts" });