Episode ini membahas autentikasi di Gatsby: pola client-side auth, integrasi Netlify Identity dan Firebase Auth, proteksi route dengan client-only paths, serta penyimpanan token dan rendering konten yang aman.

Beberapa konten memang harus dibatasi: dashboard pengguna, area anggota, atau draft. Karena Gatsby statis, proteksi dilakukan di sisi client dengan pola tertentu — dan kita perlu jujur tentang batas keamanannya.
Episode 13 membahas pola client-side auth, integrasi Netlify Identity dan Firebase Auth, proteksi route, serta penyimpanan token dan rendering konten yang aman.
Semua JavaScript dan HTML situs sudah dikirim ke browser saat halaman dimuat. Artinya, melindungi halaman statis berarti menahan konten dari render sampai pengguna terbukti login — bukan menyembunyikan file dari internet. Untuk konten yang benar-benar rahasia, kombinasikan dengan serverless function di sisi server.
Pola yang dipakai hampir semua situs Gatsby: wrapRootElement menyediakan auth context di seluruh aplikasi, lalu komponen pelindung mengecek status login sebelum menampilkan konten.
Netlify Identity menyediakan registrasi, login, dan token JWT tanpa server. Install dua paket:
npm install gatsby-plugin-netlify-identityKonfigurasikan di gatsby-config.js dengan URL situs kalian:
module.exports = {
plugins: [
{
resolve: "gatsby-plugin-netlify-identity",
options: {
url: "https://situs-kalian.netlify.app",
},
},
],
}Provider auth harus membungkus seluruh aplikasi lewat gatsby-browser.js:
import { NetlifyIdentityProvider } from "react-netlify-identity"
export const wrapRootElement = ({ element }) => (
<NetlifyIdentityProvider url="https://situs-kalian.netlify.app">
{element}
</NetlifyIdentityProvider>
)wrapRootElement dijalankan Gatsby untuk membungkus semua halaman. Dengan provider aktif, hook useIdentityContext bisa dipakai di komponen mana pun.
Halaman area anggota sebaiknya ditangani sebagai client-only route. Install plugin pendukung:
npm install gatsby-plugin-create-client-pathsDaftarkan di gatsby-config.js dengan pola URL:
module.exports = {
plugins: [
{
resolve: "gatsby-plugin-create-client-paths",
options: { prefixes: ["/app/*"] },
},
],
}Prefix /app/* membuat semua halaman di bawahnya ditangani sepenuhnya di client, cocok untuk dashboard pribadi.
Komponen pembungkus mengecek status login sebelum merender konten:
import { navigate } from "gatsby"
import { useIdentityContext } from "react-netlify-identity"
const ProtectedRoute = ({ children }) => {
const { isLoggedIn } = useIdentityContext()
if (!isLoggedIn) {
navigate("/login")
return null
}
return children
}Jika isLoggedIn bernilai false, pengguna diarahkan ke halaman login dan konten tidak dirender. Pola ini sederhana namun efektif untuk gating pengalaman pengguna.
Plugin Identity menyimpan token JWT dengan aman di localStorage dan mengelola refresh-nya. Untuk integrasi Auth0, @auth0/auth0-react menangani penyimpanan dengan pola yang sama. Prinsipnya: biarkan library yang mengelola token, jangan menulis penyimpanan token sendiri yang berisiko.
Konten rahasia sebaiknya tidak pernah dirender ke HTML statis. Karena client-only paths dan autentikasi berjalan setelah mount, konten hanya muncul di DOM setelah login — tapi ini tetap bisa dibaca oleh pengguna yang mengerti DevTools. Untuk tingkat kerahasiaan tinggi, tarik data dari serverless function yang memvalidasi token JWT di sisi server sebelum mengembalikan data.
Auth0 menyediakan SDK @auth0/auth0-react. Polanya sama: bungkus aplikasi dengan Auth0Provider, lalu pakai useAuth0 untuk status login. Cocok untuk organisasi yang butuh fitur SSO dan manajemen pengguna enterprise.
Firebase Authentication mendukung email, Google, dan banyak provider lain. Dengan Firebase, selain autentikasi kalian juga bisa mengelola pengguna secara gratis di skala besar. Pilih sesuai ekosistem yang sudah kalian pakai.
Episode 13 membuka autentikasi di Gatsby: pola client-side auth, integrasi Netlify Identity, proteksi route dengan client-only paths, serta penyimpanan token dan rendering yang aman.
Inti yang harus dibawa pulang:
wrapRootElement membungkus aplikasi dengan auth provider./app/* untuk halaman pribadi.Di episode 14 selanjutnya kita akan membahas API integration dan caching — fetching API saat build time dan runtime, strategi caching untuk situs statis, incremental builds, serta pengurangan waktu build dengan selective sourcing.