티스토리 뷰
연동하기 전에는 Kakao Developers에서 가입후 진행해야합니다.
Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
developers.kakao.com
카카오 API인증 받기
기억하기 - REST API키
기억하기 - Redirect URI(처음만들때는 비어져 있을텐데 이 부분은 서버에서 허가 받은다음 이동할 URL입니다.)
EX) http://localhost:3000/user/kakao/finish
※주의 : 이 부분이 같지 않다면 페이지에서 에러가 뜹니다. 같은 경로를 사용해야합니다.
기억해야 할것 정리 - REST API키, Redirect URI, Client Secret 코드
인가코드 받기
Kakao developers 공식사이트 로그인 구현 방법 안내
카카오 로그인을 하기 위해선 위 1번째 step처럼 인가코드를 받아야 합니다.
위 링크를 들어가서 아래로 내리면 인가코드 받기, 토큰 받기등의 방법이 적혀있습니다.
이러한 내용들을 참고해서 카카오 로그인을 만들었습니다.
중요한건 해당 페이지에 나와있는 경로나 변수명에 오타가 있으면 안됩니다.
요청 예제
https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}
홈페이지에 보면 이 경로로 요청을 보내도록 예제가 나와있습니다.
이러한 정보들을 토대로 로직을 짜겠습니다.
일단 동의 내역을 얻을수 있는 즉, 인가 내역을 받는 코드를 작성해야 합니다.
// 인가를 받기위한 로직
export const startKakaoLogin = (req, res) => {
const baseUrl = "https://kauth.kakao.com/oauth/authorize"; // 인가 받는 베이스 url
const config = {
client_id: process.env.KAKAO_CLIENT, //REST API키
redirect_uri: process.env.KAKAO_RIDIRECT_URL, // Redirect URI경로
response_type: "code",
};
const params = new URLSearchParams(config).toString();
// URLSearchParams 메서드는 객체에 나눠져 있는 문자열(config)을 URL 처럼 합쳐준다.
// 오브젝트로 반환되기 때문에 toString()메서드를 사용하여 문자열로 바꿔줌
// 최종 요청해야하는 URL
// https://kauth.kakao.com/oauth/authorize?response_type=code&client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}
const finalUrl = `${baseUrl}?${params}`; // 최종 생성되는 URL
console.log(finalUrl);
return res.redirect(finalUrl);
};
이렇게 받아오는 로직을 짠뒤 라우터에 경로를 지정해줍니다.
router.get("/kakao/start", startKakaoLogin);
그런뒤 브라우저에 localhost:3000/api/kakao/start 경로로 요청을 해보면 아래와 같은 동의 창이 뜹니다.
동의를 해주면
설정했던 Redirect URI 의 경로로 get방식을 통해 나오는걸 확인 할수 있습니다.
토큰 받기
일단 Node.js에서는 fetch()함수를 기본적으로 제공하지 않기 때문에 모듈을 설치해 주어야 합니다.
모듈 설치
저는 yarn패키지를 사용했기 때문에 yarn 명령어로 설치 했습니다.
// yarn 패키지
yarn add node-fetch
// npm 패키지
npm i node-fetch
그런뒤 fetch 함수를 사용하여 finish경로로 토큰 요청을 하고 토큰을 받아옵니다.
// 토큰발급 및 로그인
export const finishKakaoLogin = async (req, res) => {
const baseUrl = "https://kauth.kakao.com/oauth/token"; // 토큰 받는 베이스 url
const config = {
client_id: process.env.KAKAO_CLIENT, // //REST API키
client_secret: process.env.KAKAO_SECRET, // 카카오에서 받은 secret 키, 토큰 발급 시, 보안을 강화하기 위해 추가 확인하는 코드
grant_type: "authorization_code",
redirect_uri: process.env.KAKAO_RIDIRECT_URL, // 토큰을 받은뒤 리 다이렉트할 URI
code: req.query.code, // startKakaoLogin이 끝나면 code=~~로 쿼리스트링으로 문자열이 들어옴.
};
const params = new URLSearchParams(config).toString(); // 마찬가지로 config를 한 url로 설정해준다.
const finalUrl = `${baseUrl}?${params}`;
// node.js에서는 fetch를 지원하지 않기 때문에 node-fetch를 install해야함.
const kakaoTokenRequest = await fetch(finalUrl, {
method: "POST", // 토큰을 받는것이기 때문에 post
headers: {
"Content-type": "application/json", // 이 부분을 명시하지않으면 text로 응답을 받게됨
},
});
const json = await kakaoTokenRequest.json();
console.log(json);
res.send(JSON.stringify(json)); // 프론트엔드에서 정보 확인
마찬가지로 이렇게 받아오는 로직을 짠뒤 라우터에 경로를 지정해줍니다.
router.get("/kakao/finish", finishKakaoLogin);
이렇게 한뒤 다시 처음부터 요청을 보내게 되면
res.send()로 보낸 브라우저와 콘솔에서 받아온 토큰을 확인 할 수가 있습니다.
이제 이 액세스 토큰을 이용하여 카카오 로그인 정보를 가져오는 로직을 만들어 보면
// 토큰발급 및 로그인
export const finishKakaoLogin = async (req, res) => {
const baseUrl = "https://kauth.kakao.com/oauth/token"; // 토큰 받는 베이스 url
const config = {
client_id: process.env.KAKAO_CLIENT, // //REST API키
client_secret: process.env.KAKAO_SECRET, // 카카오에서 받은 secret 키, 토큰 발급 시, 보안을 강화하기 위해 추가 확인하는 코드
grant_type: "authorization_code",
redirect_uri: process.env.KAKAO_RIDIRECT_URL, // 토큰을 받은뒤 리 다이렉트할 URI
code: req.query.code, // startKakaoLogin이 끝나면 code=~~로 쿼리스트링으로 문자열이 들어옴.
};
const params = new URLSearchParams(config).toString(); // 마찬가지로 config를 한 url로 설정해준다.
const finalUrl = `${baseUrl}?${params}`;
// node.js에서는 fetch를 지원하지 않기 때문에 node-fetch를 install해야함.
const kakaoTokenRequest = await (
await fetch(finalUrl, {
method: "POST", // 토큰을 받는것이기 때문에 post
headers: {
"Content-type": "application/json", // 이 부분을 명시하지않으면 text로 응답을 받게됨
},
})
).json();
if ("access_token" in kakaoTokenRequest) {
// kakaoTokenRequest안에 access_Token이 있다면?
// api진입
const { access_token } = kakaoTokenRequest;
const userRequest = await (
await fetch("https://kapi.kakao.com/v2/user/me", {
headers: {
Authorization: `Bearer ${access_token}`, // 토큰 생성
"Content-type": "application/json",
},
})
).json();
console.log(userRequest);
return res.status(200).json({ message: userRequest });
} else {
// access 토큰이 없다면 로그인
return res.status(401).json({ message: "로그인이 필요합니다." });
}
};
이렇게 json화 시켜주고 그 정보를 사용해서 액세스 토큰의 여부에 따라 리다이렉트를 해준뒤 확인해보면
정보를 잘 가져오는걸 확인할 수 있습니다.
참고 - 삐제제의 개발노트
'프로그래밍 기초 > Node.js' 카테고리의 다른 글
AWS S3를 사용하여 이미지 업로드 기능 구현하기 (0) | 2024.02.22 |
---|---|
NODE의 Bcrypt [패스워드 안전하게 저장] (0) | 2024.02.15 |
데이터 유효성 검증과 에러처리 (1) | 2024.02.01 |
미들웨어란? (0) | 2024.01.30 |
REST API구현하기 [할일 메모 사이트] (1) | 2024.01.29 |