이 중 프론트에서 해줘야될 것
- 요청 API 로 카카오 로그인 요청
- 설정한 redirect url로 넘어갈 때 쿼리로 넘어간 code 인가 코드를 받아 백엔드 서버로 요청 보내기
export const KAKAO_AUTH_URL = `https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=${process.env.NEXT_PUBLIC_KAKAO_REST_API_KEY}&redirect_uri=${process.env.NEXT_PUBLIC_KAKAO_REDIRECT_URI}&scope=profile_nickname,account_email,gender`
client_id
: 앱 REST API 키 값
redirect_uri
: 인가 코드 받기 요청의 응답으로 redirect 될 url 주소 (프론트에서 접근 가능해야 함!!!!)
// loginModal.tsx
// 중략
<div className="socialLogBtn">
<Link href={KAKAO_AUTH_URL}>
<button className="kakaoBtn">카카오로 로그인</button>
</Link>
</div>
카카오 로그인 로직을 처리하기 위해 url 경로 대로 폴더 및 tsx 파일 생성 (*Next.js
app router 버전)
page.tsx
// login > oauth2 > code > kakao > page.tsx
import Auth2Redirect from '@/app/(not-logged)/_component/auth2Redirect'
import LoadingScreen from '@/components/loading-screen'
import React from 'react'
const page = async () => {
return (
<div>
<LoadingScreen /> // 요청 처리중에 띄울 로딩 컴포넌트
<Auth2Redirect /> // 요청 로직 처리 ( return null)
</div>
)
}
export default page
해당 페이지로 redirect 되면 화면에는 Auth2Redirect
컴포넌트 내부 로직이 처리되는 동안 LoadingScreen
컴포넌트가 보여지게 된다
Auth2Redirect.tsx
'use client'
// 중략
const Auth2Redirect = () => {
const [code, setCode] = useState<string | null>(null)
const router = useRouter()
let isSuccessed = false
useEffect(() => {
if (typeof window !== 'undefined') {
new URL(window.location.href).searchParams.get('code') &&
setCode(new URL(window.location.href).searchParams.get('code'))
// 1. 인가코드 추출
}
}, [])
const kakaoLogin = async () => {
// 3. 추출된 인가코드로 백엔드에 로그인 요청
try {
const res = await axios.get(
`/usports/login/oauth2/code/kakao?code=${code}`,
)
if (res.status === 200) {
// 로그인 성공 시 로직 처리
isSuccessed = true
}
} catch (error) {
console.log(error)
}
if (isSuccessed) {
router.replace('/')
}
}
useEffect(() => {
code !== null && kakaoLogin()
// 2. 인가코드 추출되면 kakaoLogin 로직 실행
}, [code])
return null
}
export default Auth2Redirect
끝!