Spaces:
Runtime error
Runtime error
| import type { IncomingMessage, ServerResponse } from "http"; | |
| import { getCookie, setCookie } from "cookies-next"; | |
| import type { NextApiRequest, NextApiResponse } from "next"; | |
| import type { AuthOptions } from "next-auth"; | |
| import type { Adapter, AdapterUser } from "next-auth/adapters"; | |
| import Credentials from "next-auth/providers/credentials"; | |
| import { v4 } from "uuid"; | |
| import { z } from "zod"; | |
| const monthFromNow = () => { | |
| const now = new Date(Date.now()); | |
| return new Date(now.setMonth(now.getMonth() + 1)); | |
| }; | |
| function cookieToString(cookie: string | undefined | null | boolean) { | |
| switch (typeof cookie) { | |
| case "boolean": | |
| return cookie.toString(); | |
| case "string": | |
| return cookie; | |
| default: | |
| return ""; | |
| } | |
| } | |
| export const options = ( | |
| adapter: Adapter, | |
| req: NextApiRequest | IncomingMessage, | |
| res: NextApiResponse | ServerResponse | |
| ): AuthOptions => { | |
| return { | |
| adapter, | |
| providers: [ | |
| Credentials({ | |
| name: "Username, Development Only (Insecure)", | |
| credentials: { | |
| name: { label: "Username", type: "text" }, | |
| superAdmin: { label: "SuperAdmin", type: "text" }, | |
| }, | |
| async authorize(credentials, req) { | |
| if (!credentials) return null; | |
| const creds = z | |
| .object({ | |
| name: z.string().min(1), | |
| superAdmin: z.preprocess((str) => str === "true", z.boolean()).default(false), | |
| }) | |
| .parse(credentials); | |
| const user = await adapter.getUserByEmail(creds.name); | |
| return user | |
| ? adapter.updateUser({ | |
| id: user.id, | |
| name: creds.name, | |
| superAdmin: creds.superAdmin, | |
| }) | |
| : adapter.createUser({ | |
| name: creds.name, | |
| email: creds.name, | |
| image: undefined, | |
| emailVerified: null, | |
| superAdmin: false, | |
| } as AdapterUser); | |
| }, | |
| }), | |
| ], | |
| pages: { | |
| signIn: "/signin", | |
| }, | |
| callbacks: { | |
| // Fallback to base url if provided url is not a subdirectory | |
| redirect: (params: { url: string; baseUrl: string }) => | |
| params.url.startsWith(params.baseUrl) ? params.url : params.baseUrl, | |
| async signIn({ user }) { | |
| if (user) { | |
| const session = await adapter.createSession({ | |
| sessionToken: v4(), | |
| userId: user.id, | |
| expires: monthFromNow(), | |
| }); | |
| // eslint-disable-next-line @typescript-eslint/no-unsafe-call | |
| setCookie("next-auth.session-token", session.sessionToken, { | |
| expires: session.expires, | |
| req: req, | |
| res: res, | |
| }); | |
| } | |
| return true; | |
| }, | |
| }, | |
| jwt: { | |
| encode: () => { | |
| const cookie = getCookie("next-auth.session-token", { | |
| req: req, | |
| res: res, | |
| }); | |
| return cookieToString(cookie); | |
| }, | |
| decode: () => { | |
| return null; | |
| }, | |
| }, | |
| }; | |
| }; | |