Firebase - jh0152park/Wiki-Notepad GitHub Wiki

Setup

JavaScript ํ”„๋กœ์ ํŠธ์— Firebase ์ถ”๊ฐ€

Firebase ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-29 แ„‹แ…ฉแ„’แ…ฎ 9 43 20 แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-29 แ„‹แ…ฉแ„’แ…ฎ 9 43 34 แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-29 แ„‹แ…ฉแ„’แ…ฎ 9 43 45 แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-29 แ„‹แ…ฉแ„’แ…ฎ 9 44 30

ํ”„๋กœ์ ํŠธ์— ์•ฑ ์ถ”๊ฐ€ํ•˜๊ธฐ

iOS / Android / Web ์„ ํƒํ•˜๊ธฐ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-29 แ„‹แ…ฉแ„’แ…ฎ 9 45 01 แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-29 แ„‹แ…ฉแ„’แ…ฎ 9 53 05 แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-29 แ„‹แ…ฉแ„’แ…ฎ 9 53 29

  1. npm install firebase
  2. firebaseConfig key ๋ณต์‚ฌํ•ด๋‘๊ธฐ
  3. src ํด๋”๊ฐ€ ์•„๋‹Œ ์ตœ์ƒ์œ„ ํด๋”์— .env ํŒŒ์ผ ์ƒ์„ฑํ•˜๊ธฐ
  4. ๋ณต์‚ฌํ•ด๋‘” firebaseConfig ํ‚ค๊ฐ’์„ .env ํŒŒ์ผ์— ๋ณต์‚ฌํ•˜๊ธฐ
  5. .gitignore์— .env๊ฐ€ ํฌํ•จ ๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ

.env ํŒŒ์ผ์„ ๋งŒ๋“ค๋•Œ KEY๊ฐ’ ์ด๋ฆ„ ์•ž์— REACT_APP_ ์„ ๊ผญ ๋ถ™์—ฌ์•ผ ํ•œ๋‹ค

REACT_APP_API_KEY="my api key"
REACT_APP_AUTH_DOMAIN="my auth domail"
REACT_APP_PROJECT_ID="my project id"
REACT_APP_STORAGE_BUCKET="my sotrage bucket"
REACT_APP_MESSAGING_SENDER_ID="my messaging sender id"
REACT_APP_APP_ID="my app id"

.env ํŒŒ์ผ์˜ key๊ฐ’์€ ์•„๋ž˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•œ๋‹ค

const API_KEY = process.env.REACT_APP_API_KEY;
const AUTH_DOMAIN = process.env.REACT_APP_AUTH_DOMAIN;
...
...

firebase config ์„ ์–ธํ•˜๊ธฐ

import { initializeApp } from "firebase/app";

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,
};

const app = initializeApp(firebaseConfig);

Email + Password๋กœ ์ธ์ฆ ์—†์ด ๊ณ„์ • ๋งŒ๋“ค๊ธฐ(CreateWithEmailAndPassword)

Doc: https://firebase.google.com/docs/auth/web/password-auth?hl=ko

ํ•ด๋‹น ์˜ˆ์‹œ์˜ ๊ฒฝ์šฐ Email ์ฃผ์†Œ์™€ ๊ธฐ๋ณธ์ ์ธ Password๋กœ ๊ณ„์ •์„ ๋งŒ๋“ค๊ฒŒ ๋˜๋Š”๋ฐ,

๋ฌธ์ œ๋Š” ์œ ํšจํ•˜์ง€ ์•Š์€ Email ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์š”๊ตฌ์‚ฌํ•ญ์„ ์ž˜ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

Firebase ํ”„๋กœ์ ํŠธ ์ฝ˜์†”์—์„œ ์ธ์ฆ -> ๋กœ๊ทธ์ธ๋ฐฉ๋ฒ• -> ์ด๋ฉ”์ผ/๋น„๋ฐ€๋ฒˆํ˜ธ ์‚ฌ์šฉ ์„ค์ •์„ ๋จผ์ € ํ•ด์•ผํ•œ๋‹ค.

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-29 แ„‹แ…ฉแ„’แ…ฎ 11 43 36 แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-29 แ„‹แ…ฉแ„’แ…ฎ 11 44 25 แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-29 แ„‹แ…ฉแ„’แ…ฎ 11 45 23 แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-29 แ„‹แ…ฉแ„’แ…ฎ 11 45 47 แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-29 แ„‹แ…ฉแ„’แ…ฎ 11 46 28

Create a new account code

async function onSubmit(data: any) {
        try {
            setCreate(true);
            const credentials = await createUserWithEmailAndPassword(
                auth,
                data.email,
                data.password
            );
            // await updateProfile(credentials.user, {
            //   displayName: data.name
            // })
            //
            alert("Create Account Done");
        } catch (e) {
            if (e instanceof FirebaseError) {
                const errorCode = e.code;
                const errorMessage = e.message;
                console.log(`code: ${errorCode}, message: ${errorMessage}`);
            }
        } finally {
            reset();
            setCreate(false);
        }
    }

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-30 แ„‹แ…ฉแ„’แ…ฎ 11 56 05

Email + Password๋กœ Email์ธ์ฆ์„ ๊ฑฐ์ณ ๊ณ„์ • ๋งŒ๋“ค๊ธฐ(CreateWithEmailAndPassword + Email Verification)

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-31 แ„‹แ…ฉแ„’แ…ฎ 5 05 14

ํ˜น์‹œ ๋ชจ๋ฅด๋‹ˆ Firebase console์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์—†๋Š” email login ํ—ˆ์šฉํ•ด์ค€๋‹ค.

์ง€๊ธˆ ์™€์„œ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ, ๊ตณ์ด ์•ˆํ•ด์ค˜๋„ ๋˜๋Š” ๋ถ€๋ถ„์ธ๊ฑฐ ๊ฐ™์Œ, ์–ด์ฐจํ”ผ createEmailWithPassword๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์„๊ฑฐ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์—

Workflow

์ด๋ฉ”์ผ ๊ณ„์ • ์ธ์ฆ์€ ์ด๋ฉ”์ผ + ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๊ณ„์ •์„ ๋งŒ๋“œ๋Š” ๋‹จ๊ณ„์—์„œ ์ถ”๊ฐ€์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š” ๊ณผ์ •์ด๋‹ค.

๋”ฐ๋ผ์„œ ๊ณ„์ •์„ ์ƒ์„ฑ๋งŒ ํ• ๋ฟ ์ž๋™์œผ๋กœ ๋กœ๊ทธ์ธ์ด ๋˜๋„๋ก ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค. (์ด๋ฉ”์ผ ์ธ์ฆ์ด ์•„์ง ์ด๋ฃจ์–ด ์ง€์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)

์ด๋ฉ”์ผ๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๊ณ„์ •์„ ๋งŒ๋“ค์—ˆ์œผ๋ฉด, ํ•ด๋‹น ์ด๋ฉ”์ผ๋กœ Verification link๋ฅผ ์ „์†กํ•˜๊ณ , ์œ ์ €๊ฐ€ ์ž…๋ ฅํ•œ Email์ด Validํ•œ Email์ด๋ผ๋ฉด ํ•ด๋‹น link๋ฅผ ํ†ตํ•ด ์ด๋ฉ”์ผ ์ธ์ฆ์„ ์ง„ํ–‰ํ•œ๋‹ค.

๊ทธ ์ดํ›„ Sign in with email์„ ํ•˜๋Š” ๊ณผ์ •์—์„œ user.emailVerfied๊ฐ€ True์ผ ๊ฒฝ์šฐ ์ •์ƒ์ ์œผ๋กœ ๋กœ๊ทธ์ธ์„ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜๊ณ , ์ธ์ฆ์ด ๋˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ ๋กœ๊ทธ์ธ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.


Verification link at email

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-31 แ„‹แ…ฉแ„’แ…ฎ 5 43 08

user.emailVerified ๊ฐ’

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-31 แ„‹แ…ฉแ„’แ…ฎ 5 45 08

Send email code

function onSubmit(data: any) {
    setCreate(true);
    createUserWithEmailAndPassword(auth, data.email, data.password)
        .then((userCredential) => {
            sendEmailVerification(userCredential.user).then(() => {
                alert("send verification email");
                console.log(userCredential.user.email);
                console.log(userCredential.user.emailVerified);
            });
        })
        .catch((error) => {
            const errorCode = error.code;
            const errorMessage = error.message;
            console.log(`code: ${errorCode}, message: ${errorMessage}`);
        })
        .finally(() => {
            reset();
            setCreate(false);
        });
}

Kakao Login

์ƒ๊ฐ๋ณด๋‹ค ์†์ด ๋งŽ์ด ๊ฐ€๋Š” ๋ถ€๋ถ„์ด๋ผ, Firebaes๋ฅผ ์‚ฌ์šฉํ• ๋•Œ๋Š” ๊ทธ๋ƒฅ ๊ตฌ๊ธ€์—์„œ ์ง€์›ํ•ด์ฃผ๋Š” Auth๋งŒ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ํŽธํ• ๊ฑฐ๊ฐ™๋‹ค...

์ฐธ๊ณ : https://velog.io/@hadam/integrate-kakao-login-with-firebase-using-react-and-functions-2

1.์นด์นด์˜ค ๊ฐœ๋ฐœ์ž ์‚ฌ์ดํŠธ ์ด๋™

์Šคํฌ๋ฆฐ์ƒท 2023-12-31 ์˜คํ›„ 8 30 28

  1. ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ถ”๊ฐ€

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-31 แ„‹แ…ฉแ„’แ…ฎ 8 35 45

  1. ์•ฑ ํ‚ค ๊ธฐ์–ตํ•˜๊ธฐ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-31 แ„‹แ…ฉแ„’แ…ฎ 8 37 23

  1. ํ”Œ๋žซํผ ์„ค์ •ํ•˜๊ธฐ => Web ํ”Œ๋žซํผ ๋“ฑ๋ก

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-31 แ„‹แ…ฉแ„’แ…ฎ 8 46 54

  1. ์‚ฌ์ดํŠธ ๋„๋ฉ”์ธ ๋“ฑ๋กํ•˜๊ธฐ ex)localhost:3000

  2. ์นด์นด์˜ค ๋กœ๊ทธ์ธ์ด ๋  Redirect URI ๋“ฑ๋ก

์Šคํฌ๋ฆฐ์ƒท 2023-12-31 ์˜คํ›„ 8 52 57

6-1. ์ƒํƒœ ํ™œ์„ฑํ™” On

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-31 แ„‹แ…ฉแ„’แ…ฎ 9 27 57

6-2. Redirect URI ๋“ฑ๋ก

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-31 แ„‹แ…ฉแ„’แ…ฎ 10 10 46

  1. ๋™์˜ํ•ญ๋ชฉ => ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์„ค์ • ex)ํ”„๋กœํ•„ ์ •๋ณด, ์ด๋ฉ”์ผ, ์„ฑ๋ณ„, etc...

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-31 แ„‹แ…ฉแ„’แ…ฎ 10 46 16

  1. JavaScript Download ์—์„œ Full SDK ๋ณต์‚ฌ ํ›„ public/index.html์˜ head ๋ถ€๋ถ„์— ๋ณต์‚ฌ

  2. ์ฝ”๋“œ์—์„œ ๋ณต์‚ฌํ•ด๋‘” KEY๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”

if (!window.Kakao.isInitialized()) {
    window.Kakao.init(process.env.REACT_APP_KAKAO_JAVASCRIPT_KEY);
}
  1. Kakao ๋กœ๊ทธ์ธ ์‹คํ–‰
function onLoginWithKakao() {
    const redirectUri = `${window.location.origin}/login/kakao`;
    const scope = [KAKAO_SCOPE_NICKNAME, KAKAO_SCOPE_PROFILE_IMAGE].join(
        ","
    );

    window.Kakao.Auth.authorize({
        redirectUri,
        scope,
    });
}
  1. ๋กœ๊ทธ์ธ์ด ์ •์ƒ์ ์œผ๋กœ ์ด๋ฃจ์–ด์กŒ๋‹ค๋ฉด, ๋ฏธ๋ฆฌ ์ •์˜ํ•ด๋‘” Redirect URL๋กœ ์ด๋™ํ•˜๊ฒŒ๋˜๊ณ  Token์ด ํ•จ๊ป˜ ๋„˜์–ด์˜ด

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-12-31 แ„‹แ…ฉแ„’แ…ฎ 11 24 18

  1. URLSearchParams๋ฅผ ์ด์šฉํ•ด code(token)๊ฐ’์„ ๊ฐ–๊ณ ์˜ค๊ณ , ๋งŒ์•ฝ ์—†๋‹ค๋ฉด ๋กœ๊ทธ์ธ์„ ๋‹ค์‹œํ•˜๋„๋ก ๊ตฌ์„ฑ
const navigate = useNavigate();
const searchParams = new URLSearchParams(window.location.search);
const code = searchParams.get("code");

console.log(code);
if (!code) {
    navigate("/login");
}
  1. firebase function์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด npm install firebase-tools ๋ช…๋ น์–ด๋กœ ์„ค์น˜ ์ง„ํ–‰

13-1. ํ„ฐ๋ฏธ๋„์— firebase login ์ž…๋ ฅ ํ›„ ๋กœ๊ทธ์ธ (๋กœ๊ทธ์ธ์ด ๋˜์–ด ์žˆ๋‹ค๋ฉด, Already logged in as my account๊ฐ€ ์ถœ๋ ฅ)

13-2. ํ„ฐ๋ฏธ๋„์— firebase init functions ์ž…๋ ฅ

13-3. Use an existing project ์„ ํƒ ํ›„ ํ˜„์žฌ firebase์—์„œ ์‚ฌ์šฉ์ค‘์ธ ํ”„๋กœ์ ํŠธ ์„ ํƒ

13-4. ์–ธ์–ด๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์„ ํƒ

13-5. ์ดํ›„ ๋ชจ๋‘ ์—”ํ„ฐ

13-6. ์ด์ œ functions/src/index.ts์— ์ฝ”๋“œ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅ

  1. HTTP ์š”์ฒญ ํ•จ์ˆ˜ ์ž‘์„ฑ

ํ•„์š”ํ•œ API๋“ค

  • ํด๋ผ์ด์–ธํŠธ๋กœ ๋ถ€ํ„ฐ ์ธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ „๋‹ฌ ๋ฐ›๋Š” ํ•จ์ˆ˜

  • ์ธ๊ฐ€ ์ฝ”๋“œ๋กœ ํ† ํฐ ๋ฐœ๊ธ‰์„ ์š”์ฒญํ•  ํ•จ์ˆ˜

  • ์นด์นด์˜ค ์œ ์ € ์ •๋ณด๋ฅผ ๊ฐ–๊ณ ์˜ค๋Š” ํ•จ์ˆ˜

  • Firebase auth user ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜

  • ์ƒ์„ฑ๋œ user id๋ฅผ ์ด์šฉํ•ด custom token์„ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜

  • ํด๋ผ์ด์–ธํŠธ๋กœ custome token์„ ์ „๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜

  1. npm install express cors ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด ์„ค์น˜

  2. functions/src/index.tsํŒŒ์ผ์— express ์•ฑ์„ ์ƒ์„ฑ

import * as functions from "firebase-functions";
import * as express from "express";
import * as cors from "cors";

const app = express();
app.use(cors({ origin: true }));

app.post("/kakao", async (req, res) => {
    // TODO: API ๊ตฌํ˜„ํ•˜๊ธฐ
});

exports.auth = functions.https.onRequest(app);

KAKAO REST API DOC

  1. ํ† ํฐ์„ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” REST APIํ‚ค๊ฐ€ ํ•„์ˆ˜์ด๊ณ , ์ด๋Š” [๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜] > [์•ฑ ํ‚ค]์—์„œ ํ™•์ธ ๊ฐ€๋Šฅ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-01-01 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 12 16 52

  1. axios๋ฅผ ์ด์šฉํ•ด HTTP ํ†ต์‹ ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , dotenv๋„ ํ•จ๊ป˜ ์„ค์น˜ npm install dotenv axios

  2. getToken ํ•จ์ˆ˜ ์ž‘์„ฑ

async function getToken(code: string): Promise<ITokenResponse> {
    const body = {
        grant_type: "authorization_code",
        client_id: process.env.REACT_APP_KAKAO_REST_API_KEY as "",
        redirect_uri: process.env.REACT_APP_KAKAO_REDIRECT_URI as "",
        code: code,
    };

    const res = await axios.post(
        "https://kauth.kakao.com/oauth/token",
        new URLSearchParams(body)
    );
    return res.data;
}
  1. getKakaoUser ํ•จ์ˆ˜ ์ž‘์„ฑ
async function getKakaoUser(token: string): Promise<KakaoUser> {
    const res = await axios.get("https://kapi.kakao.com/v2/user/me", {
        headers: { Authorization: `Bearer ${token}` },
    });
    return res.data;
}
  1. npm install firebase-admin ๋ช…๋ ์–ด๋กœ ์„ค์น˜

๊ฐ€์ ธ์˜จ ์นด์นด์˜ค ์œ ์ € ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ Firebae Authentication์„ ์ด์šฉํ•ด ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ์–ด์•ผ ํ•˜๊ณ ,

์ด๋•Œ ์‚ฌ์šฉ์ž์™€ Custom Token์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ Admin SDK๊ฐ€ ํ•„์š”.

21-1. ์„œ๋น„์Šค ๊ณ„์ •์˜ ๋น„๊ณต๊ฐœ ํ‚ค ํŒŒ์ผ ์ƒ์„ฑ

a. Firebase Console -> Project ์„ค์ • -> ์„œ๋น„์Šค ๊ณ„์ • -> ์ƒˆ ๋น„๊ณต๊ฐœ ํ‚ค ์ƒ์„ฑ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-01-01 แ„‹แ…ฉแ„’แ…ฎ 1 47 34

b. ์ƒ์„ฑ๋œ ํ‚ค๋Š” download๋˜๋Š”๋ฐ ๋ณต๊ตฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ˆ ์ž˜ ๊ฐ„์ง

c. Download๋œ ํ‚ค ํŒŒ์ผ์„ ์ด์šฉํ•ด Admin App์„ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ Secret Manager๋ฅผ ์ด์šฉํ•ด ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•ด์•ผํ•จ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-01-01 แ„‹แ…ฉแ„’แ…ฎ 2 07 48

d. ๋จผ์ € ๊ตฌ๊ธ€ ์ฝ˜์†”๋กœ ์ด๋™ํ•ด ๋ณด์•ˆ ๋น„๋ฐ€์„ ์ƒ์„ฑ. ๋ฐ”๋กœ๊ฐ€๊ธฐ

- ๊ฒฐ์ œ ์ •๋ณด๊ฐ€ ์—ฐ๋™์ด ๋˜์–ด์•ผ ๋ณด์•ˆ ๋น„๋ฐ€ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅ

e. ์ด๋ฆ„, ๋‹ค์šด๋กœ๋“œ ํ–ˆ๋˜ ๋น„๊ณต๊ฐœํ‚ค ์—…๋กœ๋“œ

f. functions/src/index.ts์˜ exports.auth = ๋ถ€๋ถ„์— ์ƒ์„ฑํ•œ ๋ณด์•ˆ ๋น„๋ฐ€์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก runWith์ถ”๊ฐ€

g. Admin app ์ดˆ๊ธฐํ™” ์ฝ”๋“œ ์ž‘์„ฑ

  1. ์‚ฌ์šฉ์ž ๋งŒ๋“ค๊ธฐ

์ƒ์„ฑํ•œ app์„ ์ด์šฉํ•ด auth service๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์œ ์ € ์—…๋ฐ์ดํŠธ๋ฅผ ์‹œ๋„ํ•จ. ๋งŒ์•ฝ ์œ ์ €๊ฐ€ ์—†๋‹ค๋ฉด auth/user-not-found ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ, try-catch๋ฌธ์„ ์ด์šฉํ•ด ์œ ์ € ์ƒ์„ฑ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•จ. ์ถ”๊ฐ€ ์˜ค๋ฅ˜ ์ฝ”๋“œ ๋ชฉ๋ก

  1. ์ปค์Šคํ…€ ํ† ํฐ ๋งŒ๋“ค๊ธฐ

  2. ํ•จ์ˆ˜๋ฐฐํฌ

    • firebase deploy --only functions

๋ฐฐํฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด Firebase Console -> ๋ชจ๋“  ์ œํ’ˆ -> Functions์—์„œ ํ™•์ธ ๊ฐ€๋Šฅ

๋ฐฐํฌ ์‹œ๋„์‹œ --fix ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ

$ (cd functions && npx eslint . --fix)
# or
$ (cd functions && node_modules/eslint/bin/eslint.js . --fix)

๋ฐฐํฌ ์‹œ๋„์‹œ Missing JSDoc comment ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, .eslintrc.jsํŒŒ์ผ์˜ rules๋ถ€๋ถ„์— ์•„๋ž˜์™€ ๊ฐ™์ด ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€

"require-jsdoc": [
    "error",
    {
        require: {
            getToken: false,
            getKakaoUser: false,
            getAdminApp: false,
            updateOrCreateUser: false,
        },
    },
],

์œ„ ๋ฐฉ๋ฒ•์ด ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ํ•จ์ˆ˜๋“ค์„ function์ด ์•„๋‹Œ arrow function์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•œ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ react-router ์—์„œ deploy functions ์ค‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ๋˜๊ณ ์žˆ๋‹ค.

๋ฒ„์ „6๋ถ€ํ„ฐ @types/react-router-dom์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‚ญ์ œํ•˜๋„๋ก ํ•œ๋‹ค. npm uninstall @types/react-router-dom ์ฐธ๊ณ ๋งํฌ

Error: Your project recap-1daad must be on the Blaze (pay-as-you-go) plan to complete this command. Required API cloudbuild.googleapis.com can't be enabled until the upgrade is complete. To upgrade, visit the following URL:

https://console.firebase.google.com/project/recap-1daad/usage/details

๋˜ ์œ„์™€๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ, firebase console์—์„œ ์š”๊ธˆ์ œ๋ฅผ ์•„์ง ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„์„œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ์ด๋‹ค.

์ด๋ฏธ ๊ฒฐ์ œ์ •๋ณด๋Š” ์ž…๋ ฅํ•ด ๋‘์—ˆ์œผ๋ฏ€๋กœ ์ฝ˜์†”์—์„œ ์š”๊ธˆ์ œ๋ฅผ Spark ์—์„œ Blaze๋กœ ๋ณ€๊ฒฝํ•˜์ž. แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-01-01 แ„‹แ…ฉแ„’แ…ฎ 10 49 35

์ดํ›„ ๋””ํ”Œ๋กœ์ด ์‹œ๋„์‹œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์—๋Ÿฌ๋ฅผ ์ž˜ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‹ค์‹œ ํ™•์ธํ•ด๋ณด์ž. (dependencies๊ฐ€ ์ž˜ ์„ค์น˜ ๋˜์–ด์žˆ๋Š”์ง€ ๋“ฑ๋“ฑ) แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-01-01 แ„‹แ…ฉแ„’แ…ฎ 11 07 55

โš ๏ธ functions/src/index.ts ์—์„œ ์‚ฌ์šฉํ•  ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Š” local .env ํŒŒ์ผ์ด ์•„๋‹Œ google cloud console์— ๋ณด์•ˆ ๋น„๋ฐ€๋กœ ๋งŒ๋“ค์–ด์•ผํ•จ โš ๏ธ

๋™์‹œ์— functions/src/index.ts ํŒŒ์ผ ์—์„œ๋„ ์•„๋ž˜์™€ ๊ฐ™์ด ๋„ฃ์–ด์ค˜์•ผ ํ•จ

exports.auth = functions
    .runWith({
        secrets: [
            "SERVICE_ACCOUNT_KEY",
            "KAKAO_CLIENT_SECRET_KEY",
            "REACT_APP_KAKAO_REDIRECT_URI",
            "REACT_APP_KAKAO_REST_API_KEY",
        ],
    })
    .https.onRequest(app);
โš ๏ธ **GitHub.com Fallback** โš ๏ธ