62 lines
1.6 KiB
TypeScript
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());
|