next-auth
의 Pages 공식 문서를 확인하면 아직 예전의 Next.js page 디렉토리를 사용하는 방법만 소개되어 있다.
물론, page와 app 디렉토리. 12버전과 13버전을 마스터할 분들은 쉽게 변환이 되겠지만.
아직 익숙하지 않은 분들을 위해 13 version app 디렉토리에 적용하는 방법을 소개하려고 한다.
import type {
GetServerSidePropsContext,
InferGetServerSidePropsType,
} from "next"
import { getProviders, signIn } from "next-auth/react"
import { getServerSession } from "next-auth/next"
import { authOptions } from "../api/auth/[...nextauth]"
export default function SignIn({
providers,
}: InferGetServerSidePropsType<typeof getServerSideProps>) {
return (
<>
{Object.values(providers).map((provider) => (
<div key={provider.name}>
<button onClick={() => signIn(provider.id)}>
Sign in with {provider.name}
</button>
</div>
))}
</>
)
}
export async function getServerSideProps(context: GetServerSidePropsContext) {
const session = await getServerSession(context.req, context.res, authOptions)
// If the user is already logged in, redirect.
// Note: Make sure not to redirect to the same page
// To avoid an infinite loop!
if (session) {
return { redirect: { destination: "/" } }
}
const providers = await getProviders()
return {
props: { providers: providers ?? [] },
}
}
page.tsx
import { getProviders } from "next-auth/react";
import SignInOptions from "./SignInOptions";
export default async function Page() {
const providers = (await getProviders()) ?? {};
return <SignInOptions providers={providers} />;
}
SignInOptions.tsx
"use client";
import { ClientSafeProvider, signIn } from "next-auth/react";
type Props = {
providers: Record<string, ClientSafeProvider>;
};
export default function SignInOptions({providers}: Props) {
return (
<>
{Object.values(providers).map((provider) => (
<div key={provider.name}>
<button onClick={() => signIn(provider.id)}>
Sign in with {provider.name}
</button>
</div>
))}
</>
);
}