spring boot
react에서 구글로그인 구현-II(feat. @react-oauth/google)
hoazzinews
2024. 12. 30. 06:13
> npm install @react-oauth/google
MyGoogleLogin.jsx
import React from "react";
import axios from "axios";
import { useGoogleLogin } from '@react-oauth/google';
import { useNavigate } from "react-router-dom";
function MyGoogleLogin({ setIsLoggedIn }) {
// handlers
// AXIOS
const handleLoginSuccess = async (res) => {
console.log('handleLoginSuccess()');
console.log('res: ', res);
const accessToken = res.access_token; // Access Token
console.log('Access Token: ', accessToken);
try {
const response = await axios.post(
'http://localhost:8090/member/oauth/google',
{ accessToken }, // body 데이터
{
headers: {
'Content-Type': 'application/json',
},
withCredentials: true, // 쿠키 포함
}
);
console.log('response.status: ', response.status);
if (response.status === 200) {
const result = response.data;
alert("로그인 성공: " + result.signInResponse.message);
// 액세스 토큰을 로컬 스토리지에 저장
localStorage.setItem("accessToken", result.tokenResponse.accessToken);
setIsLoggedIn(true);
navigate('/');
} else {
alert("로그인 실패: " + response.data.signInResponse.message);
}
} catch (error) {
if (error.response) {
// 서버가 에러를 응답한 경우
console.log('response error: ', error.response.data);
alert("로그인 실패: " + error.response.data.signInResponse.message);
} else {
// 서버에 요청이 도달하지 못한 경우 또는 네트워크 에러
console.error('Error during server communication:', error);
}
}
}
const handleLoginFailure = (err) => {
console.log('handleLoginFailure()');
}
// hooks
const googleLogin = useGoogleLogin({
onSuccess: handleLoginSuccess,
onError: handleLoginFailure,
scope: 'profile email', // 필요한 권한
flow: 'implicit', // 또는 'authorization_code' (권장)
});
const navigate = useNavigate();
return(
<button
onClick={() => googleLogin()}
style={{
backgroundColor: '#4285F4',
color: 'white',
padding: '10px 20px',
margin: '3px',
border: 'none',
borderRadius: '3px',
fontSize: '16px',
cursor: 'pointer',
}}
>
Google Login
</button>
);
}
export default MyGoogleLogin;
SignIn.jsx에 GoogleOAuthProvider 추가
import MyGoogleLogin from "./MyGoogleLogin";
import { GoogleOAuthProvider } from "@react-oauth/google";
... 생략
// var
const clientId = '-----';
return (
<article>
<div className="wrap">
<input
type="text"
value={id}
placeholder="INPUT ID"
onChange={(e) => {
setId(e.target.value);
}}/><br />
<input
type="password"
value={pw}
placeholder="INPUT PW"
onChange={(e) => {
setPw(e.target.value);
}}/><br />
<button onClick={signinBtnClickHandler}>SIGN-IN</button>
<br />
<GoogleOAuthProvider clientId={clientId}>
<MyGoogleLogin setIsLoggedIn={setIsLoggedIn} />
</GoogleOAuthProvider>
</div>
</article>
);
Modify.jsx
... 생략
return (
<article>
<div className="wrap">
<input
type="text"
value={id}
readOnly disabled
/><br />
<input
type="password"
value={pw}
placeholder="INPUT PW"
onChange={(e) => {
setPw(e.target.value);
}}/><br />
<input
type="text"
value={mail}
readOnly disabled
/><br />
<button onClick={modifyBtnClickHandler}>MODIFY</button>
</div>
</article>
)