-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
✨ feat: auth.js signIn 테스트를 위한 세팅 #10
- Loading branch information
1 parent
ac5333a
commit f56c508
Showing
1 changed file
with
86 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,87 @@ | ||
import NextAuth from "next-auth"; | ||
// ? Reference https://github.dev/nextauthjs/next-auth-example/blob/main/app/api/protected/route.ts | ||
// ? Reference https://www.heropy.dev/p/MI1Khc | ||
|
||
export const { handlers, signIn, signOut, auth } = NextAuth({ | ||
providers: [], | ||
}); | ||
import NextAuth, { Account, NextAuthConfig, Session, User } from "next-auth"; | ||
import { AdapterUser } from "next-auth/adapters"; | ||
import { JWT } from "next-auth/jwt"; | ||
import { ProviderType } from "next-auth/providers"; | ||
import Kakao from "next-auth/providers/kakao"; | ||
|
||
const config = { | ||
providers: [Kakao], | ||
// ? 사용자 지정 로그인, 로그아웃 및 오류 페이지를 만들 때 사용할 URL을 지정합니다. 지정한 페이지는 해당 기본 제공 페이지를 재정의합니다. | ||
pages: { | ||
signIn: "/signIn", | ||
}, | ||
callbacks: { | ||
// * protected page 설정 | ||
authorized({ request, auth }) { | ||
const { pathname } = request.nextUrl; | ||
if (pathname === "/mypage") return !!auth; | ||
return true; | ||
}, | ||
// * callbackUrl이 있다면 callbackUrl로 리다이렉트 | ||
redirect: async ({ url, baseUrl }: { url: string; baseUrl: string }) => { | ||
if (url.startsWith("/")) return `${baseUrl}${url}`; | ||
if (url) { | ||
const { search, origin } = new URL(url); | ||
const callbackUrl = new URLSearchParams(search).get("callbackUrl"); | ||
if (callbackUrl) | ||
return callbackUrl.startsWith("/") | ||
? `${baseUrl}${callbackUrl}` | ||
: callbackUrl; | ||
if (origin === baseUrl) return url; | ||
} | ||
return baseUrl; | ||
}, | ||
// ? 이 콜백은 JSON 웹 토큰이 생성되거나(즉, 로그인할 때) 업데이트될 때마다(즉, 클라이언트에서 세션에 액세스할 때마다) 호출됩니다. | ||
// ? 여기서 반환하는 모든 내용은 JWT에 저장되어 세션 콜백으로 전달됩니다. 여기에서 클라이언트에 반환할 항목을 제어할 수 있습니다. | ||
// ? 그 외의 모든 내용은 프런트엔드에서 보관됩니다. JWT는 기본적으로 AUTH_SECRET 환경 변수를 통해 암호화됩니다. | ||
jwt: async ({ | ||
token, | ||
account, | ||
}: { | ||
token: JWT; | ||
user?: User | AdapterUser; | ||
account?: Account | null; | ||
}) => { | ||
token.accessToken = account?.access_token; | ||
return token; | ||
}, | ||
// ? 로그인한 사용자의 활성 세션입니다. | ||
session: async ({ session, token }: { session: Session; token: JWT }) => { | ||
if (token?.accessToken) { | ||
session.accessToken = token.accessToken; | ||
} | ||
return session; | ||
}, | ||
}, | ||
// ? 인증 및 데이터베이스 작업에 대한 디버그 메시지를 사용하려면 디버그를 true로 설정합니다. | ||
debug: process.env.NODE_ENV !== "production" ? true : false, | ||
} satisfies NextAuthConfig; | ||
|
||
export const { signIn, signOut, handlers, auth } = NextAuth(config); | ||
|
||
declare module "next-auth" { | ||
// * 카카오 Account 응답에 맞게 수정 | ||
interface Account { | ||
access_token?: string; | ||
token_type?: string; | ||
refresh_token?: string; | ||
expires_in?: number; | ||
refresh_token_expires_in?: number; | ||
expires_at?: number; | ||
provider: string; | ||
type: ProviderType; | ||
providerAccountId: string; | ||
} | ||
// * 세션이 accessToken 필드값 추가 ( 필요에 따라 더 추가 ) | ||
interface Session { | ||
accessToken?: string; | ||
} | ||
} | ||
declare module "next-auth/jwt" { | ||
interface JWT { | ||
accessToken?: string; | ||
} | ||
} |