4번 빼고 4개의 과정만 프론트엔드가 구현하면 카카오 소셜 로그인을 할 수 있다.
카카오에서 제공하는 로그인 화면 링크
https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code
변수 REST_API_KEY, REDIRECT_URI는 백엔드가 kakao developers에서 제공
저 두 변수는 유출되면 안된다. env 파일을 만들어 따로 저장하기.
window.location.href를 이용해 주소를 바꿨다.
// Login.tsx
const Login = () => {
const REST_API_KEY = '백엔드에게 받기1';
const REDIRECT_URI = '백엔드에게 받기2';
const link = `https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code`;
const loginHandler = () => {
window.location.href = link;
};
return (
<button type='button' onClick={loginHandler}>
카카오 로그인
</button>
);
};
페이지에 로그인 하기 버튼이 생기고 이걸 누르면 카카오 계정 정보를 입력할 수 있는 창이 뜬다.
제대로 했다면 크롬 주소 확인하기.
나는 백엔드에게 REDIRECT_URI로 http://localhost:3000/kakao/callback
를 받았다.
실제로 이동되는 주소
http://localhost:3000/kakao/callback?code=카카오에서 준 인가 코드
백엔드에서 받은 REDIRECT_URI에 ?code=알수없는 긴코드 이것을 백엔드에게 넘겨주면 된다
아래처럼 작성해 연결
<Route exact path='/kakao/callback' element={<Redirection />} />
내가 만든 Redirection 페이지에서 받은 인가 코드를 백엔드에게 전달
const code = window.location.search; // code?=이상한코드가한가득
useEffect(() => {
const response = await baseInstance.post(`/user/kakao${code}`);
console.log(response);
navigate('/');
}, []);
import { useEffect } from 'react';
import { useNavigate } from 'react-router';
import { baseInstance } from '../apis/config';
const Redirection = () => {
const code = window.location.search;
console.log(code);
const navigate = useNavigate();
useEffect(() => {
const fetchData = async () => {
try {
const response = await baseInstance.post(`/user/kakao${code}`);
console.log(response);
if (response.data.statusCode === 200) {
// 토큰을 받아서 localStorage 같은 곳에 저장하는 코드를 여기에 쓴다.
localStorage.setItem('Authorization', response.headers.authorization);
navigate('/');
}
} catch (error) {
console.log('kakao 소셜 로그인 에러 : ', error);
window.alert('소셜 로그인에 실패하였습니다.');
window.location.href = `/login`;
}
};
fetchData();
}, []);
return <div>로그인 중입니다.</div>;
};
export default Redirection;
로컬스토리지에 저장한 토큰을 필요할때마다 request에 담아서 보내면된다.
axios
.get(주소, {
headers: {
Authorization: `Bearer ${localStorage.getItem('Authorization')}`,
},
})