Vercel/src/auth/index.ts
2024-03-19 12:34:09 -05:00

62 lines
1.6 KiB
TypeScript

import { isPathProtected } from '@/site/paths';
import NextAuth, { User } from 'next-auth';
import Credentials from 'next-auth/providers/credentials';
export const KEY_CREDENTIALS_SIGN_IN_ERROR = 'CredentialsSignin';
export const KEY_CREDENTIALS_SIGN_IN_ERROR_URL =
'https://errors.authjs.dev#credentialssignin';
export const KEY_CALLBACK_URL = 'callbackUrl';
export const {
handlers: { GET, POST },
signIn,
signOut,
auth,
} = NextAuth({
providers: [
Credentials({
async authorize({ email, password }) {
if (
process.env.ADMIN_EMAIL && process.env.ADMIN_EMAIL === email &&
process.env.ADMIN_PASSWORD && process.env.ADMIN_PASSWORD === password
) {
const user: User = { email, name: 'Admin User' };
return user;
} else {
return null;
}
},
}),
],
callbacks: {
authorized({ auth, request }) {
const { pathname } = request.nextUrl;
const isUrlProtected = isPathProtected(pathname);
const isUserLoggedIn = !!auth?.user;
const isRequestAuthorized = !isUrlProtected || isUserLoggedIn;
return isRequestAuthorized;
},
},
pages: {
signIn: '/sign-in',
},
});
export const safelyRunServerAdminAction = async <T>(
callback: () => T,
): Promise<T> => {
const session = await auth();
if (session?.user) {
return callback();
} else {
throw new Error('Unauthorized server action request');
}
};
export const generateAuthSecret = () => fetch(
'https://generate-secret.vercel.app/32',
{ cache: 'no-cache' },
).then(res => res.text());