Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/app/(auth)/signup/applicant/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -112,14 +112,14 @@ export default function ApplicantSignupPage() {
JSON.stringify({ provider: "google", role: "APPLICANT" })
)}`}
>
<Image src="/icons/social/social_google.svg" width={72} height={72} alt="구글 로그인" />
<Image src="/icons/social/social_google.svg" width={72} height={72} alt="구글 회원가입" />
</Link>
<Link
href={`https://kauth.kakao.com/oauth/authorize?client_id=${process.env.NEXT_PUBLIC_KAKAO_REST_API_KEY}&redirect_uri=${process.env.NEXT_PUBLIC_KAKAO_REDIRECT_URI}&response_type=code&state=${encodeURIComponent(
JSON.stringify({ provider: "kakao", role: "APPLICANT" })
)}`}
>
<Image src="/icons/social/social_kakao.svg" width={72} height={72} alt="카카오 로그인" />
<Image src="/icons/social/social_kakao.svg" width={72} height={72} alt="카카오 회원가입" />
</Link>
</div>
</form>
Expand Down
4 changes: 2 additions & 2 deletions src/app/(auth)/signup/owner/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -134,14 +134,14 @@ export default function OwnerSignupPage() {
JSON.stringify({ provider: "google", role: "OWNER" })
)}`}
>
<Image src="/icons/social/social_google.svg" width={72} height={72} alt="구글 로그인" />
<Image src="/icons/social/social_google.svg" width={72} height={72} alt="구글 회원가입" />
</Link>
<Link
href={`https://kauth.kakao.com/oauth/authorize?client_id=${process.env.NEXT_PUBLIC_KAKAO_REST_API_KEY}&redirect_uri=${process.env.NEXT_PUBLIC_KAKAO_REDIRECT_URI}&response_type=code&state=${encodeURIComponent(
JSON.stringify({ provider: "kakao", role: "OWNER" })
)}`}
>
<Image src="/icons/social/social_kakao.svg" width={72} height={72} alt="카카오 로그인" />
<Image src="/icons/social/social_kakao.svg" width={72} height={72} alt="카카오 회원가입" />
</Link>
</div>
</form>
Expand Down
4 changes: 2 additions & 2 deletions src/app/api/oauth/callback/google/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ export const GET = async (req: NextRequest) => {
},
});

const { access_token, id_token } = tokenResponse.data;
const { id_token } = tokenResponse.data;

// id_token 디코딩
const decodedIdToken = decodeJwt(id_token);
Expand Down Expand Up @@ -84,6 +84,6 @@ export const GET = async (req: NextRequest) => {
return response;
} catch (error) {
console.error("Google login error:", error);
return NextResponse.json({ message: "Internal Server Error" }, { status: 500 });
return NextResponse.json({ message: "서버에러" }, { status: 500 });
}
};
84 changes: 29 additions & 55 deletions src/app/api/oauth/callback/kakao/route.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { NextRequest, NextResponse } from "next/server";
import axios from "axios";
import { OauthUser } from "@/types/oauth/oauthReq";
import apiClient from "@/lib/apiClient";

Expand All @@ -25,72 +24,47 @@ export const GET = async (req: NextRequest) => {
}
const { provider, role } = parsedState;

const KAKAO_TOKEN_URL = "https://kauth.kakao.com/oauth/token";
const KAKAO_USER_INFO_URL = "https://kapi.kakao.com/v2/user/me";
const clientId = process.env.NEXT_PUBLIC_KAKAO_REST_API_KEY;
const redirectUri = process.env.NEXT_PUBLIC_KAKAO_REDIRECT_URI;

if (!clientId || !redirectUri) {
return NextResponse.json({ message: "Environment variables not set" }, { status: 500 });
}

const params = new URLSearchParams({
grant_type: "authorization_code",
client_id: clientId,
redirect_uri: redirectUri,
code: code,
});
const kakaoUser: OauthUser = {
role: role,
name: "", // 기본값 설정 (빈 문자열)
token: code, // 인가코드 그대로 전달
redirectUri: redirectUri,
};

try {
// 액세스 토큰 요청
const tokenResponse = await axios.post(KAKAO_TOKEN_URL, params);
const { access_token } = tokenResponse.data;

if (!access_token) {
return NextResponse.json({ message: "Failed to retrieve access token" }, { status: 400 });
}

// 액세스 토큰을 사용하여 사용자 정보 요청
const userInfoResponse = await axios.get(KAKAO_USER_INFO_URL, {
headers: {
Authorization: `Bearer ${access_token}`,
},
});

const user = userInfoResponse.data;

const kakaoUser: OauthUser = {
role: role,
name: user.properties?.nickname,
token: code, // 인가 코드 그대로 사용
redirectUri: redirectUri,
};

try {
const kakaoSignupResponse = await apiClient.post(`/oauth/sign-up/${provider}`, kakaoUser);
console.log("카카오 회원가입 성공:", kakaoSignupResponse.data);
} catch (error) {
const errorMessage = (error as any).response?.data;
console.log("카카오 회원가입 에러", errorMessage);
}
// 인가코드를 포함한 데이터를 백엔드로 전달
const kakaoSignupResponse = await apiClient.post(`/oauth/sign-up/${provider}`, kakaoUser);
console.log("카카오 회원가입 성공:", kakaoSignupResponse.data);

// 사용자 정보를 클라이언트에 반환
return NextResponse.json(kakaoUser);
} catch (error) {
console.error("Kakao login error:", error);
// return NextResponse.json(kakaoSignupResponse.data);
} catch (error: any) {
// 에러 타입 명시
console.error("카카오 회원가입 에러:", error.response?.data || error.message);

// Axios 에러인 경우 상세 정보 제공
if (axios.isAxiosError(error)) {
const { response } = error;
if (response) {
return NextResponse.json(
{ message: response.data?.msg || "Error during Kakao API call" },
{ status: response.status || 500 }
);
}
}
// return NextResponse.json({ message: error.response?.data || "Error during Kakao signup" }, { status: 500 });
}

// 기타 에러 처리
return NextResponse.json({ message: "Internal Server Error" }, { status: 500 });
try {
// 사용자 정보를 클라이언트에 반환
const response = NextResponse.redirect("http://localhost:3000");
response.cookies.set("user", JSON.stringify(kakaoUser), {
httpOnly: true,
secure: process.env.NODE_ENV === "production",
sameSite: "strict",
maxAge: 60 * 60 * 24, // 1일
path: "/",
});
return response;
} catch (error: any) {
console.error("카카오 회원가입 에러:", error.response?.data || error.message);
return NextResponse.json({ message: error.response?.data || "서버에러" }, { status: 500 });
}
};
Loading