๋ฆฌ์กํธ ์นด์นด์ค ๋ก๊ทธ์ธ (ํ๋ก ํธ ์์ ๋ก๊ทธ์ธ)
๋ฆฌ์กํธ ์นด์นด์ค ๋ก๊ทธ์ธ (ํ๋ก ํธ ์์ ๋ก๊ทธ์ธ)
์ด๋ฒ ํ๋ก์ ํธ์์ ์งํํ ์ฝ๋๋ฅผ ์์๋ก ์ค๋ช ๋๋ฆฌ๊ฒ ์ต๋๋ค.
1. ๋ก๊ทธ์ธ ํด๋ฆญ ๋ฒํผ์ ํด๋ฆญ์ ์คํํ ํจ์ ์ถ๊ฐ
<StSocialButton bc="yellow" onClick={onClickSocialLoginKakao}>
2. ์คํํ ํจ์์ ์์ ๋ก๊ทธ์ธ ๊ธฐ๋ณธ ์ฝ๋ ์ถ๊ฐ
const onClickSocialLoginKakao=()=>{ //์นด์นด์ค ๋ก๊ทธ์ธ
const restApiKey = '์นด์นด์ค ๋๋ฒจ๋กํผ์์ ๋ฐ์ REST_API_KEY'
const redirectUrl = '์ธ๊ฐ์ฝ๋ ๋ฐ๊ธ ๋ฐ์ ๋ ๋์์ฌ ํ์ด์ง'
//์์
const restApiKey = 'abcdefghijklmnopqrstuvwxyz'
const redirectUrl = 'http://localhost:3000/oauth'
const KAKAO_AUTH_URL = `https://kauth.kakao.com/oauth/authorize?
client_id=${restApiKey}&
redirect_uri=${redirectUrl}&response_type=code`;
window.location.href = KAKAO_AUTH_URL;
}
REST_API_KEY ๋ฐ๊ธ ๋ฐ๋ ์นด์นด์ค ๋ก๊ทธ์ธ ๋ฌธ์
https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api
3. ์คํํ ํจ์์ ์์ ๋ก๊ทธ์ธ ๊ธฐ๋ณธ ์ฝ๋ ์ถ๊ฐ
const KakaoAuthHandler = (props) => {
const dispatch = useDispatch();
//์นด์นด์ค์์ param์ผ๋ก ์ ๋ฌ๋ฐ์ ์ธ๊ฐ์ฝ๋๋ฅผ ์๋ฅด๋ ์ฝ๋
//๋ฐฑ์๋๋ก ์ธ๊ฐ์ฝ๋๋ง ๋ณด๋ด๊ธฐ ์ํด ํ์ํ ์ฝ๋
const code = new URL(window.location.href).searchParams.get("code");
useEffect(()=>{ //๋ฐฑ์๋๋ก ์ฟ ํค ํ ํฐ ์ ์ก
dispatch(__userOauthKakao(code))
},[])
//์ฝ๋๋ฅผ ์ธ์ฆํ๋ ๋์ ์ธ์ฆ์ด ์งํ์ค์ด๋ผ๋ UI๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ์ฝ๋
return (
<>
<Wrap>
<StLoadingText>์ฌ์ฉ์ ์ธ์ฆํ๋ ์ค ๐</StLoadingText>
//๋ชจ๋์๊ณ ๋ชจ์์ css๋ก 360๋ ๋ฌดํ ํ์ ํจ๊ณผ ์ ์ฉ
<StInfiniteRotatingLogo>โณ</StInfiniteRotatingLogo>
</Wrap>
</>
)
};
4. dispatch๋ก ์ ๋ฌ๋ฐ์ ์ธ๊ฐ์ฝ๋๋ฅผ ๋ฐฑ์๋๋ก ์ ์กํ๋ API
์ ์ก ํ ์๋ต์ ๋ฐ๋ผ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
์ด๋ฒ ํ๋ก์ ํธ์์๋ ๋ก๊ทธ์ธ ์ธ์ฆ ์ accessToken, refreshToken, nickname์ ํ์๋ก ์์ฑํ๋ค.
export const __userOauthKakao = createAsyncThunk(
"oauth/USER_OAUTH_KAKAO",
async (payload, thunkAPI) => {
try{
const data = await api.post(`auth/kakao`, {payload})
.then((res)=>{
const accessToken = res.headers.authorization;
const refreshToken = res.headers.refreshtoken;
const nickname = res.data.nickname;
//์ ์ ํ ํฐ + ๋๋ค์์ด ์๋ค๋ฉด ๊ฐ์ ธ์จ ํ ์ธํ
if(accessToken && refreshToken && nickname){
localStorage.setItem("token", accessToken);
localStorage.setItem("refreshToken", refreshToken);
localStorage.setItem("nickname", nickname);
alert('์์
๋ก๊ทธ์ธ ์ธ์ฆ ์๋ฃ!')
return window.location.assign("/main");
}else{
alert('์ธ์ฆ ์ค๋ฅ! ๋ค์ ์๋ํด์ฃผ์ธ์!')
return window.location.assign("/");
}
return res
})
return thunkAPI.fulfillWithValue(data)
}catch(error){
window.location.assign("/");
return thunkAPI.rejectWithValue(error)
}
}
);
์ ์ฐจ๋ฅผ ์ ๋ฆฌํ๋ค๋ฉด
์นด์นด์ค ๋ก๊ทธ์ธ ๋ฒํผ ํด๋ฆญ
> ์นด์นด์ค๋ก ์ธ๊ฐ์ฝ๋ ๋ฐ๊ธ ์์ฒญ
> ๋ฐ๊ธ ๋ฐ์ ์ธ๊ฐ์ฝ๋๋ฅผ ๋ฐฑ์๋์ ์ ๋ฌ
> ๊ทธ ํ ์ํ ํธ๋ค๋ง
๋ฆฌ์กํธ(ํ๋ก ํธ) ์นด์นด์ค ๋ก๊ทธ์ธ ์ค๋ช ๋!