그래서 간단하게 로그인 버튼을 만들어서 구글 로그인을 구현하려고 한다.
1단계: 우선, https://console.cloud.google.com/ 에 접속
2단계: 새 프로젝트 생성하기
2-1. 새 프로젝트 이름 (마음대로 해도됨)
2-2. 클라이언트 ID, 클라이언트 PW받기
이 부분을 미리 읽어두면, 아래 작성 코드의 흐름이 이해하기가 쉬움
✅ 사용자인증
✅ 사용자동의
✅ 인증코드
따라서, 코드는 사용자가 해당 애플리케이션(클라이언트, 브라우저)이 자신의 데이터에 엑세스하는 데 동의했다는 임시 증거, 인증코드는 한번만 사용할 수 있음
✅ 애플리케이션으로 다시 리다이렉션
✅ 애플리케이션이 코드 캡쳐
✅ 토큰교환
✅ 액세스 토큰 및 ID토큰
로그인 여부 상태 변수
const [loggedIn, setLoggedIn] = useState(false);
google oauth 구성 정보 정의
const CLIENT_ID = process.env.REACT_APP_GOOGLE_ID;
const REDIRECT_URI = "http://localhost:3000";
const SCOPE = process.env.REACT_APP_GOOGLE_SCOPE;
로그인 버튼 만들기
return (
<div>
{loggedIn ? (
<div>
<p>Google로 로그인했습니다!</p>
</div>
) : (
<button onClick={handleGoogleLogin}>Google로 로그인</button>
)}
</div>
);
};
export default GoogleLogin;
버튼 클릭시 이벤트 생성
const handleGoogleLogin = () => {
const googleOAuthUrl = `https://accounts.google.com/o/oauth2/auth?client_id=${CLIENT_ID}&redirect_uri=${REDIRECT_URI}&response_type=code&scope=${SCOPE}`;
window.location.href = googleOAuthUrl;
};
로그인 상태 변경하기
useEffect(() => {
// URL에 "code" 매개변수가 있는지 확인하여 Google 로그인이 성공했는지 여부를 확인
const urlParams = new URLSearchParams(window.location.search);
const authorizationCode = urlParams.get("code");
//인증 코드가 있는 경우 사용자를 로그인된 것으로 간주하loggedIn 상태를 true로 설정
if (authorizationCode) {
setLoggedIn(true);
}
}, []);
리다이렉션 컴포넌트 만들기(GoogleAuthRedirect.js)
axios / react-router-dom 임포트
npm install axios react-router-dom
useLocation으로 현재 위치(URL) 가져오고, useHistory를 사용해서 네비게이션을 위한 객체를 가져옴
const location = useLocation();
const history = useHistory();
code가 있는지 확인하고, 토큰을 교환하기 위한 POST요청을 수행
매개변수 파라미터 참고
useEffect(() => {
const params = new URLSearchParams(location.search);
const authorizationCode = params.get("code");
if (authorizationCode) {
// 인증 코드를 토큰으로 교환하기 위해 POST 요청
const tokenEndpoint = "https://accounts.google.com/o/oauth2/token";
const data = {
code: authorizationCode,
client_id: process.env.REACT_APP_GOOGLE_ID,
client_secret: process.env.REACT_APP_GOOGLE_PW,
redirect_uri: "http://localhost:3000/",
grant_type: "authorization_code",
};
axios
.post(tokenEndpoint, data)
.then((response) => {
const accessToken = response.data.access_token;
const idToken = response.data.id_token;
// 이 토큰들을 안전하게 저장
history.push("/welcome");
})
.catch((error) => {
// 에러 처리
});
}
}, [location.search, history]);