기록
  • Day 5 - 로그인 기능 구현하기 1
    2024년 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>&copy; {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
    댓글