แสดงบทความที่มีป้ายกำกับ Firebase แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ Firebase แสดงบทความทั้งหมด

วันศุกร์ที่ 21 มีนาคม พ.ศ. 2568

การใช้ Firebase Authentication กับ Next.js – ล็อกอินง่ายๆ ด้วย Google, Email, GitHub

อยากให้เว็บ Next.js ของเรามีระบบล็อกอินด้วย Google, Email หรือ GitHub ไหม? 🔑
Firebase Authentication เป็นตัวช่วยที่ ฟรี, ใช้งานง่าย, และ ปลอดภัย

วันนี้เราจะมาทำระบบ Sign-up & Login ด้วย Firebase Auth ใน Next.js แบบครบๆ พร้อมโค้ดตัวอย่าง! 🚀

🎯 เราจะทำอะไรบ้าง?

✅ สมัครสมาชิก & ล็อกอินด้วย Email/Password
✅ ล็อกอินด้วย Google, GitHub
✅ จัดการ Session ด้วย Firebase
✅ ใช้ Firebase SDK ใน Next.js

💡 ไม่ต้องทำระบบ Auth เอง! Firebase จัดการให้หมด แค่เขียนโค้ดเชื่อมต่อก็ใช้ได้เลย 🔥

🔥 ตั้งค่า Firebase Authentication

🛠️ 1. สมัคร Firebase และสร้างโปรเจกต์

  1. เข้าไปที่ Firebase Console
  2. กด "Add Project" → ตั้งชื่อโปรเจกต์ → กด "Continue"
  3. กด "Enable Google Analytics" หรือ ปิดก็ได้ → กด "Create Project"

🔑 2. เปิดใช้งาน Authentication

  1. ไปที่ "Build" → "Authentication"
  2. กด "Get Started"
  3. ไปที่ "Sign-in method"
  4. เปิดการใช้งาน Email/Password, Google, GitHub

🔗 3. ตั้งค่า Web API Key

  1. ไปที่ "Project settings" (ไอคอนรูปเฟือง)
  2. ไปที่ "General" → "Your apps" → กด "Web app"
  3. ตั้งชื่อแอป → กด "Register app"
  4. คัดลอก Firebase Config ไว้


⚙️ ติดตั้ง Firebase SDK ใน Next.js

1. สร้างโปรเจกต์ Next.js

    npx create-next-app my-firebase-auth
    cd my-firebase-auth
    npm install firebase

2. สร้างไฟล์ firebase.js เพื่อเชื่อมต่อ Firebase

📌 โค้ด: lib/firebase.js

import { initializeApp } from "firebase/app";
import { getAuth } from "firebase/auth";

const firebaseConfig = {
  apiKey: "YOUR_API_KEY",
  authDomain: "YOUR_AUTH_DOMAIN",
  projectId: "YOUR_PROJECT_ID",
  storageBucket: "YOUR_STORAGE_BUCKET",
  messagingSenderId: "YOUR_MESSAGING_SENDER_ID",
  appId: "YOUR_APP_ID",
};

const app = initializeApp(firebaseConfig);
export const auth = getAuth(app);

💡 อย่าลืมเปลี่ยน YOUR_API_KEY เป็นค่าจริงจาก Firebase!



✉️ สมัครสมาชิก & ล็อกอินด้วย Email/Password

📌 โค้ด: pages/auth.js

import { useState } from "react";
import { auth } from "../lib/firebase";
import { createUserWithEmailAndPassword, signInWithEmailAndPassword } from "firebase/auth";

export default function AuthPage() {
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");
  const [message, setMessage] = useState("");

  const signUp = async () => {
    try {
      await createUserWithEmailAndPassword(auth, email, password);
      setMessage("Signup successful!");
    } catch (error) {
      setMessage(error.message);
    }
  };

  const login = async () => {
    try {
      await signInWithEmailAndPassword(auth, email, password);
      setMessage("Login successful!");
    } catch (error) {
      setMessage(error.message);
    }
  };

  return (
    <div>
      <h1>Firebase Auth</h1>
      <input type="email" placeholder="Email" onChange={(e) => setEmail(e.target.value)} />
      <input type="password" placeholder="Password" onChange={(e) => setPassword(e.target.value)} />
      <button onClick={signUp}>Sign Up</button>
      <button onClick={login}>Login</button>
      <p>{message}</p>
    </div>
  );
}

✅ กรอก Email & Password แล้วสมัครหรือล็อกอินได้เลย!


🔵 ล็อกอินด้วย Google

📌 โค้ด: pages/auth.js (เพิ่มปุ่ม Google Sign-in)

import { GoogleAuthProvider, signInWithPopup } from "firebase/auth";

const loginWithGoogle = async () => {
  try {
    const provider = new GoogleAuthProvider();
    await signInWithPopup(auth, provider);
    setMessage("Login with Google successful!");
  } catch (error) {
    setMessage(error.message);
  }
};

// เพิ่มปุ่ม Login with Google
<button onClick={loginWithGoogle}>Login with Google</button>;

✅ กดปุ่ม → เลือกบัญชี Google → ล็อกอินสำเร็จ!


🛡️ จัดการ Session ด้วย Firebase

Firebase มี onAuthStateChanged ให้เราตรวจสอบว่าผู้ใช้ล็อกอินอยู่หรือไม่

📌 โค้ด: pages/index.js


import { useEffect, useState } from "react";
import { auth } from "../lib/firebase";
import { onAuthStateChanged, signOut } from "firebase/auth";

export default function Home() {
  const [user, setUser] = useState(null);

  useEffect(() => {
    const unsubscribe = onAuthStateChanged(auth, (user) => {
      setUser(user);
    });
    return () => unsubscribe();
  }, []);

  return (
    <div>
      <h1>Welcome {user ? user.email : "Guest"}</h1>
      {user ? (
        <button onClick={() => signOut(auth)}>Logout</button>
      ) : (
        <a href="/auth">Go to Login</a>
      )}
    </div>
  );
}

✅ ถ้าล็อกอินอยู่จะแสดง Email ของผู้ใช้
✅ ถ้ายังไม่ล็อกอินจะแสดงปุ่ม Go to Login


🚀 ทดสอบระบบ

  1. รันเซิร์ฟเวอร์ npm run dev
  2. เปิด http://localhost:3000/auth
  3. ลองสมัครสมาชิก & ล็อกอิน
  4. เช็คหน้าแรก ว่ามี Session หรือไม่?

🎉 เรียบร้อย! Firebase Auth ใช้งานได้แล้ว!


🎯 สรุป

✅ ใช้ Firebase Authentication ใน Next.js ได้ง่ายๆ
✅ รองรับ Email/Password, Google, GitHub
✅ Session จัดการอัตโนมัติ ด้วย Firebase SDK
✅ ใช้ onAuthStateChanged เช็กสถานะผู้ใช้

🚀 พร้อมใช้ในโปรเจกต์จริง! แค่เพิ่ม UI สวยๆ และ Database ก็เปิดให้คนใช้ได้เลย!

วันอาทิตย์ที่ 9 มีนาคม พ.ศ. 2568

การใช้ Firebase Firestore กับ Next.js

การพัฒนาแอปพลิเคชันที่มีฟีเจอร์แบบเรียลไทม์ หรือระบบที่มีฐานข้อมูลในแบบ cloud ไม่สามารถหลีกเลี่ยงการใช้บริการฐานข้อมูลที่ทันสมัยและรองรับการเชื่อมต่อที่รวดเร็วได้ หนึ่งในตัวเลือกที่ได้รับความนิยมมากคือ Firebase ซึ่งเป็นเครื่องมือของ Google ที่ช่วยให้การพัฒนาแอปพลิเคชันบนมือถือหรือเว็บแอปง่ายขึ้น รวมทั้งการใช้งาน Firestore ฐานข้อมูล NoSQL ที่ทำงานบน Cloud ที่สามารถให้บริการข้อมูลแบบเรียลไทม์ได้

ในบทความนี้เราจะมาทำความเข้าใจวิธีการใช้ Firebase Firestore ร่วมกับ Next.js ซึ่งเป็นเฟรมเวิร์กที่ช่วยให้การพัฒนาเว็บแอปมีประสิทธิภาพสูง และรองรับการทำงานทั้งในฝั่งเซิร์ฟเวอร์และไคลเอนต์ ในขั้นตอนที่ง่ายและรวดเร็ว

Firebase Firestore คืออะไร?

Firebase Firestore เป็นฐานข้อมูล NoSQL ที่รองรับการจัดเก็บข้อมูลในรูปแบบเอกสาร (Document) และคอลเล็กชัน (Collection) ซึ่งข้อมูลใน Firestore สามารถจัดเก็บเป็นชุดของคีย์และค่าที่มีความยืดหยุ่นสูง พร้อมกับการรองรับฟีเจอร์หลายๆ อย่าง เช่น การซิงค์ข้อมูลแบบเรียลไทม์ การปรับขนาดระบบได้ดี การทำงานออฟไลน์ และการเชื่อมต่อกับบริการต่างๆ ของ Firebase

ทำไมต้องใช้ Firebase Firestore กับ Next.js?

เมื่อเราพูดถึงการพัฒนาแอปพลิเคชันด้วย Next.js เราจะได้ประโยชน์จากความสามารถในการสร้างแอปที่เร็วขึ้นและสามารถรองรับทั้งการเรนเดอร์ฝั่งเซิร์ฟเวอร์ (Server-Side Rendering หรือ SSR) และการเรนเดอร์ฝั่งไคลเอนต์ (Client-Side Rendering หรือ CSR) ซึ่งทั้งสองเทคนิคนี้ช่วยให้เว็บแอปของเราโหลดเร็วและให้ประสบการณ์การใช้งานที่ดีมากขึ้น

การนำ Firebase Firestore มาใช้ร่วมกับ Next.js ช่วยให้เราสามารถพัฒนาแอปที่สามารถจัดเก็บและดึงข้อมูลจากฐานข้อมูลบน Cloud ได้อย่างสะดวก นอกจากนี้ยังช่วยให้สามารถใช้คุณสมบัติที่ดีของ Firestore เช่น การดึงข้อมูลแบบเรียลไทม์ ซึ่งเหมาะกับการสร้างแอปพลิเคชันที่ต้องการการอัปเดตข้อมูลทันที เช่น การแสดงผลของข้อมูลที่เปลี่ยนแปลงตลอดเวลา

ขั้นตอนการติดตั้งและใช้งาน Firebase Firestore กับ Next.js

1. การติดตั้ง Firebase ในโปรเจกต์ Next.js

เริ่มต้นจากการติดตั้ง Firebase SDK โดยใช้คำสั่ง npm หรือ yarn

npm install firebase

หรือ

yarn add firebase

จากนั้นให้สร้างไฟล์สำหรับการตั้งค่าการเชื่อมต่อกับ Firebase โดยปกติแล้วเราจะสร้างไฟล์ firebase.js ในโฟลเดอร์ lib หรือ utils เช่น:

// lib/firebase.js
import firebase from 'firebase/app';
import 'firebase/firestore';

const firebaseConfig = {
  apiKey: 'YOUR_API_KEY',
  authDomain: 'YOUR_AUTH_DOMAIN',
  projectId: 'YOUR_PROJECT_ID',
  storageBucket: 'YOUR_STORAGE_BUCKET',
  messagingSenderId: 'YOUR_MESSAGING_SENDER_ID',
  appId: 'YOUR_APP_ID'
};

if (!firebase.apps.length) {
  firebase.initializeApp(firebaseConfig);
} else {
  firebase.app(); // ถ้ามีการเชื่อมต่อ Firebase อยู่แล้วให้ใช้การเชื่อมต่อนั้น
}

const firestore = firebase.firestore();

export { firestore };

ในไฟล์นี้คุณจะต้องใส่ค่าคอนฟิก Firebase ที่ได้จาก Firebase Console ซึ่งประกอบด้วย apiKey, authDomain, projectId, และอื่นๆ

2. การเชื่อมต่อกับ Firestore และการดึงข้อมูล

เมื่อเชื่อมต่อกับ Firebase แล้ว เราสามารถดึงข้อมูลจาก Firestore มาใช้งานได้โดยการใช้คำสั่ง Firestore API

ตัวอย่างการดึงข้อมูลจาก Firestore ใน Next.js:

// pages/index.js
import { useEffect, useState } from 'react';
import { firestore } from '../lib/firebase';

const Home = () => {
  const [data, setData] = useState([]);

  useEffect(() => {
    const fetchData = async () => {
      const snapshot = await firestore.collection('users').get();
      const usersList = snapshot.docs.map(doc => doc.data());
      setData(usersList);
    };

    fetchData();
  }, []);

  return (
    <div>
      <h1>User List</h1>
      <ul>
        {data.map((user, index) => (
          <li key={index}>{user.name}</li>
        ))}
      </ul>
    </div>
  );
};

export default Home;

ในตัวอย่างนี้ เราดึงข้อมูลจาก Firestore ที่คอลเล็กชัน users และแสดงผลข้อมูลในเว็บเพจ

3. การอัปเดตข้อมูลใน Firestore

การอัปเดตข้อมูลใน Firestore สามารถทำได้ง่ายมากๆ เช่น การเพิ่มข้อมูลใหม่ หรือการอัปเดตข้อมูลที่มีอยู่แล้ว:

// การเพิ่มข้อมูล
const addUser = async () => {
  await firestore.collection('users').add({
    name: 'John Doe',
    email: 'john.doe@example.com'
  });
};

// การอัปเดตข้อมูล
const updateUser = async (userId) => {
  await firestore.collection('users').doc(userId).update({
    name: 'Jane Doe'
  });
};

4. การใช้งาน Firestore แบบ Real-Time

หนึ่งในฟีเจอร์ที่ยอดเยี่ยมของ Firestore คือการดึงข้อมูลแบบเรียลไทม์ โดยใช้คำสั่ง onSnapshot ซึ่งจะทำให้ข้อมูลในแอปของคุณอัปเดตอัตโนมัติเมื่อมีการเปลี่ยนแปลงใน Firestore

useEffect(() => {
  const unsubscribe = firestore.collection('users').onSnapshot(snapshot => {
    const usersList = snapshot.docs.map(doc => doc.data());
    setData(usersList);
  });

  // ทำความสะอาดการเชื่อมต่อเมื่อคอมโพเนนต์ถูก unmount
  return () => unsubscribe();
}, []);

5. การจัดการกับข้อมูลออฟไลน์

Firestore มีฟีเจอร์ที่สามารถทำงานออฟไลน์ได้ ซึ่งหมายความว่าผู้ใช้สามารถใช้งานแอปได้แม้จะไม่มีการเชื่อมต่ออินเทอร์เน็ต เมื่อมีการเชื่อมต่อใหม่ ข้อมูลจะถูกซิงค์อัตโนมัติ

สรุป

การใช้ Firebase Firestore กับ Next.js เป็นการผสมผสานที่ยอดเยี่ยมสำหรับการพัฒนาแอปที่มีความสามารถในการจัดการข้อมูลแบบเรียลไทม์ และรองรับการพัฒนาแอปที่มีประสิทธิภาพ ทั้งในแง่ของการจัดการข้อมูลและการแสดงผลบนหน้าเว็บ โดยที่ Firebase Firestore จะช่วยให้การพัฒนาแอปเป็นเรื่องง่ายขึ้น และ Next.js ก็สามารถเพิ่มความเร็วให้กับแอปได้

การทำงานร่วมกันระหว่าง Firebase และ Next.js จะช่วยให้คุณสามารถสร้างแอปพลิเคชันที่ทันสมัยและรองรับการทำงานที่หลากหลายได้อย่างมีประสิทธิภาพ

การใช้ Image Optimization ใน Next.js: โหลดไว SEO ดี ประหยัดแบนด์วิธ!

เคยเจอปัญหาเว็บโหลดช้าเพราะรูปภาพขนาดใหญ่หรือเปล่า? 📷 ถ้าใช่ Next.js มีฟีเจอร์ Image Optimization ที่ช่วยให้รูปภาพโหลดเร็วขึ้น อัตโนมัติ ไม...