회원가입과 로그인 페이지를 구현하는데 있어 유저 정보를 저장하고 가져오는데 로컬스토리지를 사용하려고 했지만 유저 정보를 가져오는데 어려움도 있었고 무엇보다 패스워드 같은 정보를 로컬스토리지에 저장할 경우 탈취위험성이 있다는 문제가 있었다. 방법을 찾아보던 도중 noSql로 디비를 구축해보기 위해 FireBase를 사용하기로 했다.
npm install firebase
REACT_APP_
으로 시작해야 한다.// .env
REACT_APP_FB_API_KEY=""
REACT_APP_FB_AUTH_DOMAIN=""
REACT_APP_FB_PROJECT_ID=""
REACT_APP_FB_STORAGE_BUCKET=""
REACT_APP_FB_MESSAGING_SENDER_ID=""
REACT_APP_FB_API_ID=""
REACT_APP_FB_MEASUREMENT_ID=""
// src/shared/firebase.js
// Import the functions you need from the SDKs you need
import { initializeApp } from 'firebase/app';
// import { getAnalytics } from 'firebase/analytics';
import {
getAuth,
// 회원가입&로그인 할때 쓰이는 함수
createUserWithEmailAndPassword,
signInWithEmailAndPassword,
} from 'firebase/auth';
// TODO: Add SDKs for Firebase products that you want to use
// https://firebase.google.com/docs/web/setup#available-libraries
// Your web app's Firebase configuration
// For Firebase JS SDK v7.20.0 and later, measurementId is optional
const firebaseConfig = {
apiKey: process.env.REACT_APP_FB_API_KEY,
authDomain: process.env.REACT_APP_FB_AUTH_DOMAIN,
projectId: process.env.REACT_APP_FB_PROJECT_ID,
storageBucket: process.env.REACT_APP_FB_STORAGE_BUCKET,
messagingSenderId: process.env.REACT_APP_FB_MESSAGING_SENDER_ID,
appId: process.env.REACT_APP_FB_API_ID,
measurementId: process.env.REACT_APP_FB_MEASUREMENT_ID,
};
// Initialize Firebase
const app = initializeApp(firebaseConfig);
// const analytics = getAnalytics(app);
const firebaseAuth = getAuth(app);
export {
firebaseAuth,
createUserWithEmailAndPassword,
signInWithEmailAndPassword,
};
async/await
를 사용할 수 있다.import {
firebaseAuth,
createUserWithEmailAndPassword,
} from '../../shared/firebase';
const SignUp = () => {
const [inputValue, setInputValue] = useState({
userName: '',
userEmail: '',
userNickName: '',
userPassword: '',
userPasswordConfirm: '',
});
const {
userName,
userEmail,
userNickName,
userPassword,
userPasswordConfirm,
} = inputValue;
(...생략)
const onRegister = async () => {
try {
const createdUser = await createUserWithEmailAndPassword(
firebaseAuth,
userEmail,
userPassword
);
navigate('/signin');
} catch (error) {
if ('auth/invalid-email') {
alert('이메일 형식을 지켜주세요.');
} else if ('auth/email-already-in-use') {
alert('이미 존재하는 이메일 입니다.');
} else if ('auth/invalid-email') {
alert('이메일 형식을 지켜주세요.');
} else if ('auth / weak - password') {
alert('비밀번호를 6자 이상 입력해주세요.');
}
}
};
}
// src/SignIn/SignIn.js
import { signInWithEmailAndPassword } from 'firebase/auth';
import { firebaseAuth } from '../../shared/firebase';
const SignIn = () => {
const [inputValue, setInputValue] = useState({
userEmail: '',
userPassword: '',
});
const { userEmail, userPassword } = inputValue;
const onLogin = async () => {
try {
const userData = await signInWithEmailAndPassword(
firebaseAuth,
userEmail,
userPassword
);
localStorage.setItem('token', JSON.stringify(userData.user.uid));
alert(`환영합니다!`);
navigate('/');
} catch (error) {
alert('잘못된 정보입니다.');
}
};
};