Javascript Tips
react spa - boot 3 ) kakao 소셜로그인 연동
탐훈
2024. 6. 27. 00:40
728x90
구조는 다음과 같다.
브라우저 -> 백엔드 요청
백엔드 -> 프론트로 300코드
브라우저 -> 카카오 서버로 인증 요청
카카오 -> 브라우저 (300, 토큰 전달)
브라우저 -> 백엔드 (토큰전달)
백엔드 -> 카카오(토큰 및 인가요청)
백엔드 -> 브라우저(세션id, crsf토큰전달)
마지막으로는
code값 200으로 끝난다.
rest api가 아닌 link 자체 이동을 해야하기 때문에
a 태그나 react의 link를 사용해야함.
혹은
window.open을 사용해서 요청하고
응답값이 잘 온다면
부모 window에서 자식window 종료 후
리다이렉팅 시켜줘야함.
해당 내용을 setInterval로
window 자식의 cookie를 감지하고
감지되고 체크한 뒤 맞다면
홈으로 랜딩시킨다.
import React, { useEffect, useRef, useState, useCallback } from 'react';
const LoginPage = () => {
const intervalId = useRef();
// 카카오 로그인
const kakaoLogin = async () => {
const width = 500; // 팝업의 가로 길이: 500
const height = 400; // 팝업의 세로 길이 : 500
const left = window.screenX + (window.outerWidth - width) / 2;
const top = window.screenY + (window.outerHeight - height) / 2;
//_kakaowindow 에다가 자식 윈도우 저장
let _kakaowindow = window.open(
'백엔드주소',
'kakako-',
`width=${width},height=${height},left=${left},top=${top}`,
);
intervalId.current = setInterval(() => {
if (!_kakaowindow?.document) return;
const childcookie = _kakaowindow.document.cookie;
const parentcookie = document.cookie;
const [_key1, val1] = childcookie.split('=');
const [_key2, val2] = parentcookie.split('=');
// 맞으면 홈으로 라우팅
if (val1 == val2) {
navigate('/');
_kakaowindow.close();
}
}, 4000);
};
useEffect(() => {
// 컴포넌트 destroy시에 interval 제거
return () => clearInterval(intervalId.current);
});
return (
로그인컴포넌트
);
};
export default LoginPage;