Skip to content

Commit

Permalink
✨ feat: auth.js signIn 테스트를 위한 세팅 #10
Browse files Browse the repository at this point in the history
  • Loading branch information
froggy1014 committed Jul 30, 2024
1 parent ac5333a commit f56c508
Showing 1 changed file with 86 additions and 4 deletions.
90 changes: 86 additions & 4 deletions auth.ts
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;
}
}

0 comments on commit f56c508

Please sign in to comment.