๊ตฌ๊ธ ๋ก๊ทธ์ธ์ ์ ์ฒด์ ์ธ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
redirect_uri
)์ code
๋ผ๋ ๋ถ๋ถ์ด ์๊ธด๋ค.)window.location.reload()
๋ก ์๋ก๊ณ ์นจ์ ํด์ค๋ค.๊ตฌ๊ธ ๋ก๊ทธ์ธ ๋ฒํผ์ ๋ง๋ ๋ค.
๋ฒํผ ํด๋ฆญ์ ์๋ url๋ก ์ด๋์ํจ๋ค. (๊ตฌ๊ธ ๋ก๊ทธ์ธ ํ๋ฉด์ผ๋ก ์ด๋๋จ)
https://accounts.google.com/o/oauth2/v2/auth?
client_id=${process.env.REACT_APP_GOOGLE_AUTH_CLIENT_ID}
&redirect_uri=https://bageasy.vercel.app/loading
&response_type=code
&scope=email+profile
clitent_id
: ๊ตฌ๊ธ ํด๋ผ์ฐ๋์์ ์ค์ ํ ํด๋ผ์ด์ธํธ id๋ฅผ ๋ฃ์ด์ค๋ค.
๊ตฌ๊ธ ํด๋ผ์ฐ๋ ์ค์ ์ ์์ ํฌ์คํ ์ฐธ๊ณ -> ๊ตฌ๊ธ ํด๋ผ์ฐ๋ ์ค์
๐ ๋ณด์์ ์ํด env ํ์ผ์ ๋ฃ์ด์ ๋ถ๋ฌ์จ๋ค.redirect_uri
: ๊ตฌ๊ธ ๋ก๊ทธ์ธ ํ ์ด๋ํ ์ฃผ์๋ฅผ ๋ฃ์ด์ค๋ค.
โ ๏ธ ์ฃผ์ํ ์ : ๋ฆฌ๋ค์ด๋ ํธ ์ฃผ์๋ฅผ ์๋ฒ๊ฐ ์๋ ํด๋ผ์ด์ธํธ๋ก ์ค์ ํด์ผ ํ๋ค.
-> ๋ก๊ทธ์ธ ํ ํด๋ผ์ด์ธํธ์์ access token์ ๋ฐ์ ๋ค ์๋ฒ๋ก ๋๊ฒจ์ฃผ์ด์ผ ํ๋๋ฐ, ๋ฆฌ๋ค์ด๋ ํธ ์ฃผ์๊ฐ ์๋ฒ๋ก ๋์ด ์์ผ๋ฉด ํด๋ผ์ด์ธํธ์์ access token๋ฅผ ๋ฐ์ ์๊ฐ ์๊ธฐ ๋๋ฌธ.
-> ๋๋ ๋ฐฑ์๋์์ access token์ ๊ฒ์ฆํ ๋์ ๋ก๋ฉ ํ์ด์ง๋ฅผ ๋ณด์ฌ ์ฃผ๋๋ก ์ค์ ํ๋ค.scope
: ๋ฐ์ ์ ๋ณด์ ๋ฒ์๋ฅผ ์ ์ด์ค๋ค. ๋๋ ์ด๋ฉ์ผ๊ณผ ํ๋กํ์ ๋ฐ๋๋ก ์ค์ ํ๋ค.
GoogleLoginPage.js
const GoogleLogin = () => {
const navigate = useNavigate();
const handleNavigateBack = () => {
navigate(-1);
};
const handleLogin = () => {
// ๊ตฌ๊ธ ๋ก๊ทธ์ธ ํ๋ฉด์ผ๋ก ์ด๋์ํค๊ธฐ
window.location.href = `https://accounts.google.com/o/oauth2/v2/auth?
client_id=${process.env.REACT_APP_GOOGLE_AUTH_CLIENT_ID}
&redirect_uri=${process.env.REACT_APP_GOOGLE_AUTH_REDIRECT_URI}
&response_type=code
&scope=email profile`;
};
return (
<SignUpContainer>
<ArrowIcon src={Arrow} onClick={handleNavigateBack} />
<Copy>์๋
ํ์ธ์</Copy>
<Copy>๊ตฌ๊ธ ๊ณ์ ์ด ์๋์?</Copy>
<Character src={Duck} />
<GBtn src={GoogleBtn} onClick={handleLogin} />
</SignUpContainer>
);
};
redirect_uri
(๋ด๊ฐ ์ค์ ํด๋ ๋ก๋ฉ ํ์ด์ง)๋ก ์ด๋๋๋ค.code=eydg123sadsad,,,
๐ ์ฌ๊ธฐ์ ์ค๊ฐ์ ๋ฐ์ํ ๋ฌธ์ ์
์ฒ์ ๊ฐ์ ์ localstorage์ ํ ํฐ์ด ๋ฐ๋ก ์ ์ฅ๋์ง ์๋ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค.
(์ด๋ฏธ ๊ฐ์ ํ ๊ฒฝ์ฐ์๋ ๋ฌธ์ x)
์์ธ์ ์ฐพ์๋ณด๋localStorage์ setItem ์ด๋ฒคํธ๋ localstorage๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๊ฐฑ์ ๋๋๊ฒ ์๋๋ผ window๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ํธ๋ฆฌ๊ฑฐ๊ฐ ๋๋ค
๊ณ ํ๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํดwindow.location.reload()
๋ฅผ ์ด์ฉํด ์๋ก๊ณ ์นจ์ ํด์ฃผ๋ ํด๊ฒฐ๋๋ค.
๊ด๋ จ ํฌ์คํ : REACT) localstorage๊ฐ ๋ฐ๋ก ์ ์ฅ๋์ง ์๋๋ค๋ฉด?
LoadingPage.js
const Loading = () => {
const navigate = useNavigate();
// ์ด๋ฏธ ๊ฐ์
ํ ์ ์ ์ผ ์ : ๋ฉ์ธ ํ์ด์ง๋ก ์ด๋
const handleHome = () => {
navigate("/home");
window.location.reload();
};
// ์ฒ์ ๊ฐ์
ํ ์ ์ ์ผ ์ : ๋๋ค์ ์ค์ ํ์ด์ง๋ก ์ด๋
const handleNickName = () => {
navigate("/nickname");
window.location.reload();
};
// ํ์ฌ url์์ code ๋ถ๋ถ ์ถ์ถ
const params = new URLSearchParams(window.location.search);
const code = params.get("code");
const handleLoginPost = async code => {
const data = {
code: code,
};
try {
const res = await axios.post(
"https://server.bageasy.net/auth/login",
data,
);
// ํ ํฐ localstorage์ ์ ์ฅ
const accessToken = res.data.accessToken;
localStorage.setItem("bagtoken", accessToken);
// ์ ๊ท/๊ธฐ์กด ํ์ ์ฌ๋ถ์ ๋ฐ๋ผ ํ์ด์ง ์ด๋
res.data.isExistingMember ? handleHome() : handleNickName();
} catch (error) {
console.log(error);
}
};
useEffect(() => {
if (code) {
handleLoginPost(code);
} else {
console.log("๋ก๊ทธ์ธ ์ฌ์๋ํ์ธ์.");
}
}, [code, navigate]);
return (
<LoadingConatiner>
<LoadingIcon src={loading} />
<H2>๋ก๊ทธ์ธ์ค์
๋๋ค...</H2>
</LoadingConatiner>
);
};
@react-oauth/google
์ ํ์ฉํ๋ฉด ์์ฃผ ๊ฐ๋จํ๊ฒ access token์ ๋ฐ์์ฌ ์ ์๋ค.(์ ์ ์ ๋ณด๋ ํ๋ก ํธ์์ ๋ฐ๋ก ๋ฐ์์ฌ ์ ์์.)
npm install @react-oauth/google@latest
npm install jwt-decode
import { GoogleLogin } from "@react-oauth/google";
import { GoogleOAuthProvider } from "@react-oauth/google";
import jwt_decode from "jwt-decode";
const GoogleLoginButton = () => {
const clientId ="";
return (
<>
<GoogleOAuthProvider clientId={clientId}>
<GoogleLogin
onSuccess={credentialResponse => {
console.log(jwt_decode(credentialResponse.credential));
}}
onError={() => {
console.log("Login Failed");
}}
/>
</GoogleOAuthProvider>
</>
);
};
export default GoogleLoginButton;
์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์์ธํ ์ ์ ์๋ค. https://www.npmjs.com/package/@react-oauth/google?activeTab=code
์ฐธ๊ณ ์๋ฃ
- https://velog.io/@nuri00/Google-OAuth-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B5%AC%ED%98%84
- https://velog.io/@seongsimk/%EA%B5%AC%EA%B8%80-%EC%86%8C%EC%85%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84-react-oauthgoogle
- https://velog.io/@nuri00/Google-OAuth-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EA%B5%AC%ED%98%84
์ข์ ๊ธ์ด๋ค์. ๊ณต์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.