- Day 5 - 로그인 기능 구현하기 12024년 09월 09일 15시 07분 19초에 업로드 된 글입니다.작성자: 삶은고구마
- 파이어베이스 로그인 준비
- 파이어베이스 로그인 설정
누이터와 파이어베이스 로그인 시스템 연동하기
파이어 베이스를 사용 장점?
:서버를 집적 구축한 상태면 회원가입,로그인 등의 기능을 직접 만들어야 하지만
파이어 베이스를 연동한다면 이 기능을 간단하게 적용할 수 있다.
1.파이어베이스 로그인 준비
1)useState 함수 위치 이동하기
useState함수의 위치를 바꾸고 AppRouter 컴포넌트에 isLoggedIn 프롭스 추가
AppRouter 컴포넌트가 라우터 역할을 하면서 코드의 가독성까지 챙기려면 상태는 App 컴포넌트에서 관리하는것이 좋다.
App.js
import { useState } from "react"; import AppRouter from "./Router"; function App() { const [isLoggedIn,setIsLoggedIn] = useState(false); return ( <> <AppRouter isLoggedIn={isLoggedIn}/> {/* jsx에 js 사용시 중괄호로 감싸기 */} <footer>© {new Date().getFullYear()}Nwitter</footer> </> ); } export default App;
Router.js
import { HashRouter as Router,Route,Routes } from "react-router-dom"; import Auth from "../routes/Auth"; import Home from "../routes/Home"; // 상위 컴포넌트에서 받은 프롭스를 구조분해 할당으로 사용한다. const AppRouter = ({isLoggedIn}) => { return( <Router> <Routes> {isLoggedIn ? ( <Route exact path="/" element={<Home />}></Route> ) : ( <Route exact path="/" element={<Auth />}></Route> )} </Routes> </Router> ); }; export default AppRouter;
2)jsconfig.json 파일과 함께 절대 경로 적용
다른 파일을 불러올 때 import구문을 사용한다.
현재 상대경로를 사용중이다. ../routes/Home과 같이 가독성이 좋지 않은 상태.
루트폴더에 jsconfig.json 파일을 만들어 아래와 같이 작성.
이 파일은 리액트에 사용할 자바스크립트를 위한 설정 파일이라 생각하면 된다.
이렇게 작성하면 절대경로를 사용할 수 있다.
{ "compilerOptions":{ "baseUrl": "src" }, "include":["src"] }
3)컴포넌트의 import문 수정하기
기존 파일에서 상대 경로가 사용된 곳을 모두 수정한다.
App.js
Router.js
index.js 의 상단 import부분의 상대경로를 절대경로로 수정
4)firebase.js의 이름 변경
절대경로의 아쉬운 점은 파일이름과 npm install로 설치된 패키지이름이 파일이름과 동일하면 오류 발생.
firebase.js 를 fbase.js로 변경
5)파이어베이스 인증 모듈 사용하기
인증모듈을 사용하려면 firebase/auth를 추가로 임포트 해야한다.
fbase.js
import firebase from "firebase/compat/app"; import "firebase/auth"; const firebaseConfig = { apiKey: process.env.REACT_APP_API_KEY, authDomain: process.env.REACT_APP_AUTH_DOMAIN, projectId: process.env.REACT_APP_PROJECT_ID, storageBucket: process.env.REACT_APP_STORAGE_BUCKET, messagingSenderId: process.env.REACT_APP_MESSAGING_SENDER_ID, appId: process.env.REACT_APP_APP_ID }; firebase.initializeApp(firebaseConfig); export const authService = firebase.auth();
파이어베이스 초기화는 다른 파일에서 참조할 필요가 없으니 fbase.js내부에 선언 (마지막 두번째줄)
하지만 로그인을 위해 사용할 firebas.auth는 다른 파일에서 참조해야 하므로 마지막처럼 선언.
5.5) 오류 발생
firebase_compat_app__WEBPACK_IMPORTED_MODULE_0__.default.auth is not a function
파이어베이스 버전이 업데이트 되면서 api 방식이 바뀌었다고 한다..
fbase.js 임포트 부분을 import "firebase/compat/auth"; 로 변경하였다 (가운데에 compat 추가)
찾아보니 완벽한 해결법은아니고 임시방편이라는데 3년전과 버전이 많이 달라서 이런 충돌이 생기는 듯 하다.
오류 해결 후 콘솔창을 열면 null을 확인.
console.log(authService.currentUser);오류 해결 후 콘솔 확인하면 null 출력 이제 currentUser에 따라 로그인 상태를 바꿔줄 수 있다.
이 값을 useSate 초기값으로 정의하기.
App.js
false에서 authService.currentUser 로 수정.
const [isLoggedIn,setIsLoggedIn] = useState(authService.currentUser);
2.파이어베이스 로그인 설정
이메일,비밀번호 기반 로그인과 구글, 깃허브 소셜 로그인을 누이터에 적용해보자!
이를 위해 파이어 베이스 기본 설정을 해야하므로 아래와 같이 작업을 진행한다.
1)파이어베이스 인증 설정하기
-파이어베이스 홈페이지로 가서 이전에 만들었던 nwitter 프로젝트를 선택.(이하 파이어베이스 콘솔)
-Authentication으로 이동 후 시작하기 선택
-사용자 탭->로그인 방법 설정 선택
-이메일,구글은 기본세팅
-깃허브
-맨 아래 코드 복사
-깃허브 본인 계정 settings 페이지로 이동
-Developer Settings 이동
-OAuth Apps 이동
-Register aplication 로 페이지 이동
-상단은 파이어베이스 github / 하단은 github 최종페이지 인데 아이디와 비밀번호를 입력해주면된다.
보안 키 발급받으려면 Generate a new client secret 버튼을 누르면 됨.
2)로그인 폼 기본 구조 만들기
Auth.js
const Auth = () =>{ return( <div> <form> <input type = "email" placeholder="Email" required/> <input type = "password" placeholder="Password" required/> <input type = "submit" value = "Log in"/> </form> <div> <button>Continue with Google</button> <button>Continue with Github</button> </div> </div> ); }; export default Auth;
3)로그인 폼이 상태를 업데이트 하도록 만들기리액트에서 input 엘리먼트를 관리하고 form 엘리먼트가 실행되도록 만들어야한다.useState 함수로 상태를 만들어주고 onChange,onSubmit 함수로 이벤트 연결하기.
import { useState } from "react"; const Auth = () =>{ const [email,setEmail] = useState(""); const [password,setPassword] = useState(""); const onChange = (event)=> { console.log(event.target.name); } const onSubmit = (event)=> { event.preventDefault(); } return( <div> <form onSubmit={onSubmit}> <input name="email" type = "email" placeholder="Email" required value={email} onChange={onChange}/> <input name="password" type = "password" placeholder="Password" required value={password} onChange={onChange}/> <input type = "submit" value = "Log in"/> </form> <div> <button>Continue with Google</button> <button>Continue with Github</button> </div> </div> ); }; export default Auth;
여기서 한 번 더 수정한다!
이렇게 하면 내가 입력한 이메일과 패스워드가 실시간으로 인풋에 반영됨
const onChange = (event)=> { // console.log(event.target.name); const{ target : {name,value}, } = event; if(name==="email"){ setEmail(value); } else if(name==="password"){ setPassword(value); } };
'공부 > 클론코딩' 카테고리의 다른 글
Day 7 - 깃허브 작업 (0) 2024.09.12 Day 7 - 누이터 서브 기능 만들기 (1) 2024.09.12 Day 4 - 클론 코딩 시작 2 (2) 2024.09.09 Day 3 - 클론 코딩 시작 (0) 2024.09.07 Day 2 - 설치 및 준비 2 (0) 2024.09.06 다음글이 없습니다.이전글이 없습니다.댓글