๐ŸŽจFrontEnd/React

๋ฆฌ์•กํŠธ ์นด์นด์˜ค ๋กœ๊ทธ์ธ (ํ”„๋ก ํŠธ ์†Œ์…œ ๋กœ๊ทธ์ธ)

IOTrue 2023. 2. 1. 19:27

๋ฆฌ์•กํŠธ ์นด์นด์˜ค ๋กœ๊ทธ์ธ (ํ”„๋ก ํŠธ ์†Œ์…œ ๋กœ๊ทธ์ธ)

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ์ง„ํ–‰ํ•œ ์ฝ”๋“œ๋ฅผ ์˜ˆ์‹œ๋กœ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

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>
    </>
  )
};

์‚ฌ์šฉ์ž์—๊ฒŒ ํ˜„์žฌ ์ง„ํ–‰ ๊ณผ์ •์„ ์•Œ๋ ค์ฃผ๋Š” oauth ํŽ˜์ด์ง€๋ฅผ ์ œ์ž‘ํ–ˆ๋‹ค.

 

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)
    }
  }
);

 

์ ˆ์ฐจ๋ฅผ ์ •๋ฆฌํ•œ๋‹ค๋ฉด

 

์นด์นด์˜ค ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ

> ์นด์นด์˜ค๋กœ ์ธ๊ฐ€์ฝ”๋“œ ๋ฐœ๊ธ‰ ์š”์ฒญ

> ๋ฐœ๊ธ‰ ๋ฐ›์€ ์ธ๊ฐ€์ฝ”๋“œ๋ฅผ ๋ฐฑ์—”๋“œ์— ์ „๋‹ฌ

> ๊ทธ ํ›„ ์ƒํƒœ ํ•ธ๋“ค๋ง

 

๋ฆฌ์•กํŠธ(ํ”„๋ก ํŠธ) ์นด์นด์˜ค ๋กœ๊ทธ์ธ ์„ค๋ช… ๋!

 

 

์นด์นด์˜ค ๋กœ๊ทธ์ธ ๋„์‹ํ™” ์ด๋ฏธ์ง€