5 글 보임 - 1 에서 5 까지 (총 5 중에서)
-
글쓴이글
-
2023년 8월 7일 03:41 #93695
정중식참가자리액트 , nodejs,mongodb사용중입니다. 클라이언트에서 버튼을누르면 아래 컴포넌트를 발동시키는데요, <SocialKakao /> 이 컴포넌트 코드는 이렇습니다.
const SocialKakao = () => { const REST_API_KEY = process.env.REACT_APP_KAKAO_ID; const REDIRECT_URI = 'http://localhost:3000/auth/kakao/callback'; // oauth 요청 URL const KAKAOURL = `https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code`;
const onLogin = () => { window.location.href = KAKAOURL; };
return ( <> <KakaoButton onClick={onLogin}> <RiKakaoTalkFill size={29} /> 카카오계정으로 회원가입 </KakaoButton> </> ); };
그리고 여기서 카카오톡 인증 뭐 어쩌구 로그인 페이지는 잘떠서 확인누르고 하면 code를 발급받는 url이 뜨는데요,
http://localhost:3000/auth/kakao/callback?code=E1V9JaV1w64BdmjRFLACDW5fz9hwGgVn7KXLX-8scpgXZl8iEs2FfIwJssUEn1_tFD64DQo9dRkAAAGJzCI4XA
이런 페이지로 가게되는데 여기서 어떻게해야되나요? 일단은 /auth/kakao/callback 경로의 컴포넌트를 만들어줘서 에러는 안뜹니다. /auth/kakao/callback 경로의 컴포넌트 코드구조는 이렇습니다.
import axios from 'axios'; import React, { useEffect } from 'react';
const KakaoCallBack = () => { useEffect(() => { const params = new URL(document.location.toString()).searchParams; const code = params.get('code'); const grant_type = 'authorization_code'; const client_id = `${process.env.REACT_APP_KAKAO_ID}`; const REDIRECT_URI = '/api/auth/kakao/callback';
axios .post( `https://kauth.kakao.com/oauth/token?grant_type=${grant_type}&client_id=${client_id}&redirect_uri=${REDIRECT_URI}&code=${code}`, {}, { headers: { 'Content-type': 'application/x-www-form-urlencoded;charset=utf-8', }, } ) .then((res) => { console.log(res); }); }, []); return <div>KakaoCallBack</div>; };
export default KakaoCallBack;
근데 useEffect이거 주석처리안해주면 Request failed with status code 400 AxiosError: Request failed with status code 400 at settle (http://localhost:3000/static/js/bundle.js:133539:12) at XMLHttpRequest.onloadend (http://localhost:3000/static/js/bundle.js:132230:66) 이런 에러가발생하네요
지금 너무 헤매고있어서 너무 힘드네요.. 처음에는 passport 로컬방식을쓰고있어서 passport-kakao를 설치해서 서버쪽에서 하고, 클라이언트쪽에서는 a태그걸고 href='/auth/kakao/' 이렇게만해줬었는데 회원가입,로그인 처리가 안되고 빈페이지만뜨길래 지금과같은 방식으로 클라이언트는 수정해줫는데요, 서버쪽코드는 인터넷 검색검색해서 이런식으로 구현해봤습니다. - 경로 app.use('/api/auth', require('./routes/api/auth')); - 미들웨어
passport.use( new KakaoStrategy( { clientID: process.env.KAKAO_ID, callbackURL: '/auth/kakao/callback', }, async (accessToken, refreshToken, profile, done) => { console.log(accessToken, profile); try { // 사용자의 정보는 profile에 들어있다. const exUser = await User.findOne({ where: { snsId: profile.id, provider: 'kakao' }, });
if (exUser) { // 로그인 성공 done(null, exUser); } else { // 가입 이력없으면 회원가입시키고 로그인 성공 const newUser = await user.create({ email: profile._json && profile._json.kaccount_email, nick: profile.displayName, snsId: profile.id, provider: 'kakao', }); done(null, newUser); } } catch (error) { done(error); } } )
- 라우터
/** kakao login */ router.get('/kakao', passport.authenticate('kakao'));
router.get( '/kakao/callback', passport.authenticate('kakao', { failureRedirect: '/', }), (req, res) => { console.log('res', res); res.redirect('/'); } );
이렇게해줬는데.. 카카오톡 클라이언트에서 지금처럼 코드를 구현했으면 제가 passport-kakao로 구현한 서버쪽 코드가 필요한가요??
2023년 8월 7일 10:04 #93728
codingapple키 마스터아마 ?code= 뒤에있는 코드를 서버로 보내서 서버는 그걸로 토큰발급받아오거나 그래야할걸요 인터넷에 예제많을텐데 따라하는게 빠릅니다
2023년 8월 7일 21:30 #93834
정중식참가자선생님 안녕하세요 정말 질문 알잘딱깔센 하게 해서 다시 찾아뵙게되었습니다. 제가 혼란스러워하고있는 부분은 passport-kakao로 서버쪽에서구현하고있는데, 그러면 프론트에서는 어떤식으로 백엔드에 요청을해서 카카오로그인을 구현해야하는가? 입니다. passport-kakao로 구현한 예제들을 봤는데, 이런식으로만 해주고있습니다. 참고코드 백엔드 경로가 예를들면 ( /api/auth/kakao)
router.get('/kakao', passport.authenticate('kakao')); 이렇다면, 프론트에서는 이런식으로만 해주고있습니다. < img src='/images/kakao_login_btn.png' alt='' /> 근데 이렇게 그대로 따라하면 카카오로그인페이지 안뜨고 에러 혹은 말그대로 /api/auth/kakao 라우트 경로의 페이지만 뜨게됩니다. (빈페이지) 그래서 썜이 말씀하신것처럼 이런식으로하게되면 프론트에서 클릭 하면 리다이렉트 페이지로가게됨 - 카카오톡 로그인버튼 컴포넌트
const REST_API_KEY = process.env.REACT_APP_REST_API; const REDIRECT_URI = 'http://localhost:3000/auth/kakao/callback'; const KAKAO_AUTH_URL = `https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code`; < img src='/images/kakao_login_btn.png' alt='' /> - 카카오톡 콜백 컴포넌트
useEffect(() => { const fetchData = async () => { const CODE = new URL(window.location.href).searchParams.get('code'); const GRANT_TYPE = 'authorization_code'; const CLIENT_ID = `${process.env.REACT_APP_REST_API}`; const REDIRECT_URI = 'http://localhost:3000/auth/kakao/callback';
try { const res = await axios.post( `https://kauth.kakao.com/oauth/token?grant_type=${GRANT_TYPE}&client_id=${CLIENT_ID}&redirect_uri=${REDIRECT_URI}&code=${CODE}`, {}, { headers: { 'Content-type': 'application/x-www-form-urlencoded;charset=utf-8', }, } );
console.log(res); } catch (error) { console.log(error); } };
fetchData(); }, []);
return <div>KakaoCallBack</div>; 콘솔로그 찍어보면 (res)에 유저 토큰이 잘 찍힙니다. 그럼 이제 이거를 콜백컴포넌트에서 서버쪽에 토큰을보내서 처리해주면되는데.. 혹은 프론트에서 토큰을 받지말고, code= 뒤에있는 코드를 body에 담아서 서버쪽에 보내고 서버쪽에서 토큰을 발급받고, 뭐 어쩌구해주면되는데.. 여기서 또 혼란스럽습니다. 1. 그러면 passport-kakao전략은 쓸모없는거아닌지 2. 기존에 passport 로컬을 쓰고있고, 이 전략을통해서 기존 회원들의 토큰값을 판단해서 사용자 인증처리 (로그인유무)를 해주고있는데 소셜로그인같은경우 어떤식으로 인증처리를해줘야하는지가 궁금합니다.. 좀 혼란스러워서 질문이 깔끔하지못한거같은데 죄송합니다 ㅠㅠ
2023년 8월 8일 09:57 #93889
codingapple키 마스터passport-kakao 쓰면 쉬워보입니다 https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-Passport-%EA%B5%AC%ED%98%84 이런거 따라합시다 https://kakao-tam.tistory.com/65 이건 jwt 사용시같군요 로그인완료되면 아무데서나 요청.user 쓰면 유저정보 알아서 나옵니다
-
글쓴이글
5 글 보임 - 1 에서 5 까지 (총 5 중에서)
- 답변은 로그인 후 가능합니다.