우선 설명을 하기에 앞서 validation은 최대한 여러 군데에서 일어나야 한다. 프론트는 물론 백엔드에서도 validation은 꾸준히 이뤄져야 한다.
우선 src 폴더 내부에 config라는 폴더를 만들고, 내부에 firebase.js라는 파일을 만든다.
여기에는 firebase를 사용하기 위한 configuration을 작성해줄 것이다.
const firebaseConfig = {
appId: process.env.REACT_APP_APP_ID,
projectId: process.env.REACT_APP_PROJECT_ID,
messagingSenderId: process.env.REACT_APP_MESSAGING_SENDER_ID,
apiKey: process.env.REACT_APP_API_KEY,
authDomain: process.env.REACT_APP_AUTH_DOMAIN,
storageBucket: process.env.REACT_APP_STORAGE_BUCKET,
};
const app = initializeApp(firebaseConfig);
위 코드를 firebase.js 파일 내부에 작성해준다.
const firebaseConfig = {
appId: process.env.REACT_APP_APP_ID,
projectId: process.env.REACT_APP_PROJECT_ID,
messagingSenderId: process.env.REACT_APP_MESSAGING_SENDER_ID,
apiKey: process.env.REACT_APP_API_KEY,
authDomain: process.env.REACT_APP_AUTH_DOMAIN,
storageBucket: process.env.REACT_APP_STORAGE_BUCKET,
};
const app = initializeApp(firebaseConfig);
const auth = getAuth(app);
const provider = new GoogleAuthProvider();
export { auth, provider };
config를 작성해주는 것은 프론트에서 서버로 요청을 보낼 때 인스턴스를 만들어주는 것이다.
다음 App.js 파일로 가보자.
Login with Google
버튼을 만들어주고 클릭하면 Firebase가 동작되는 함수를 작성해보자.
function App() {
return (
<div>
<button onClick={handleGoogleButton}>Login with Google</button>
</div>
);
}
버튼을 클릭하면 Firebase가 작동이 될 것이다. handleGoogleButton 함수를 작성해보자.
const [authenticated, setAuthenticated] = useState(false);
const handleGoogleButton = e => {
e.preventDefault();
signInWithPopup(auth, provider)
.then(userCredential => {
if (userCredential) {
setAuthenticated(true);
}
})
.catch(error => {
console.log(error.code, error.message);
});
};
(편의상 import 내용은 생략하겠다.)
버튼을 클릭하면 signInWithPopup함수가 실행이 되고 이는 인자로 auth와 provider객체를 받는다. 그래서 이 유저가 존재하면 UI state를 true로 조절한다. 없다면 catch문으로 에러 방출.
로그인 이전은 Login with Google
버튼이 보이고, 성공 시 Play
버튼이 보이도록 UI를 바꿔주자.
return (
<div>
{authenticated ? (
<button>Play</button>
) : (
<button onClick={handleGoogleButton}>Login with Google</button>
)}
</div>
);
이렇게 하면 로그인 후, state가 true로 바뀌어서 정상적으로 작동이 되는 것을 볼 수가 있다. 그런데 문제점은 새로고침 할 때마다 로그인이 풀려서 다시 Login with Google
버튼이 보인다는 것이다. 이를 고쳐주기 위해 useEffect를 사용해보자.
useEffect(() => {
auth.onAuthStateChanged(userCredential => {
if (userCredential) {
setAuthenticated(true);
userCredential.getIdToken().then(token => {
setToken(token);
});
}
});
}, []);
const handleGoogleButton = e => {
// 위와 동일 코드...
};
useEffect를 통해서 리턴문 내부의 div가 그려진 이후 useEffect내부가 실행이 되므로 onAuthStateChanged가 변화가 없을 시 계속 로그인이 유지 되도록 한다.
그러면 이제 로그아웃 기능을 구현해보자.
firebase config과정을 하고, 콘솔에 로그인 성공을 한 후 유저의 정보를 찍어보면 아래와 같이 나온다. 저 네모 속에 길~~~게 있는 부분이 바로 JWT다!