import NextAuth from "next-auth"; import EmailProvider from "next-auth/providers/email"; import { PrismaAdapter } from "@next-auth/prisma-adapter"; import { PrismaClient } from "@prisma/client"; import nodemailer from "nodemailer"; const prisma = new PrismaClient(); // async function sendVerificationRequest({ // identifier: email, // url, // provider: { server, from }, // }) { // const { host } = new URL(url); // const transport = nodemailer.createTransport(server); // await transport.sendMail({ // to: email, // from, // subject: `Sign in to ${host}`, // text: text({ url, host }), // html: html({ url, host, email }), // }); // } // Email HTML body function html({ url, host, email }) { // Insert invisible space into domains and email address to prevent both the // email address and the domain from being turned into a hyperlink by email // clients like Outlook and Apple mail, as this is confusing because it seems // like they are supposed to click on their email address to sign in. const escapedEmail = `${email.replace(/\./g, "​.")}`; const escapedHost = `${host.replace(/\./g, "​.")}`; // Some simple styling options const backgroundColor = "#ffffff"; const textColor = "#444444"; const mainBackgroundColor = "#ffffff"; const buttonBackgroundColor = "#aa1111"; const buttonBorderColor = "#aa1111"; const buttonTextColor = "#ffffff"; const headerBackgroundColor = "#000000"; return `
Sign in as ${escapedEmail}
Sign in
If you did not request this email you can safely ignore it.
`; } // Email Text body (fallback for email clients that don't render HTML, e.g. feature phones) function text({ url, host }) { return `Sign in to PEDW - Planning Casework\n${url}\n\n`; } // For more information on each option (and a full list of options) go to // https://next-auth.js.org/configuration/options export default NextAuth({ // https://next-auth.js.org/configuration/providers providers: [ EmailProvider({ server: { host: process.env.EMAIL_SERVER_HOST, port: process.env.EMAIL_SERVER_PORT, auth: { user: process.env.EMAIL_SERVER_USER, pass: process.env.EMAIL_SERVER_PASSWORD, }, }, from: process.env.EMAIL_FROM, maxAge: 10 * 60, // Magic links are valid for 10 min only async sendVerificationRequest({ identifier: email, url, provider: { server, from }, }) { const { host } = new URL(url); const transport = nodemailer.createTransport(server); await transport.sendMail({ to: email, from, subject: `Sign in to PEDW - Planning Casework`, text: text({ url, host }), html: html({ url, host, email }), }); }, }), ], adapter: PrismaAdapter(prisma), secret: process.env.SECRET, session: { jwt: true, pages: {}, theme: "dark", debug: true, }, pages: { signIn: "/auth/signin", //signOut: "/auth/signout", error: "/auth/error", // Error code passed in query string as ?error= verifyRequest: "/auth/verify-request", // (used for check email message) newUser: "/account/register", // New users will be directed here on first sign in (leave the property out if not of interest) }, callbacks: { session: async (session, user) => { console.log(user); return Promise.resolve(session); }, }, });