Autentikasi adalah tulang punggung aplikasi yang membutuhkan proteksi data pengguna. Di Next.js, kita dapat mengimplementasikan autentikasi dengan beberapa pendekatan:

Pada bagian ini, kamu akan belajar:


⚙️ 1. Setup Autentikasi dengan NextAuth.js

✅ Instalasi

npm install next-auth

✅ Buat File Route API

Buat folder app/api/auth/[...nextauth]/route.js:

import NextAuth from "next-auth";
import CredentialsProvider from "next-auth/providers/credentials";

const handler = NextAuth({
  providers: [
    CredentialsProvider({
      name: "Credentials",
      credentials: {
        email: { label: "Email", type: "text" },
        password: { label: "Password", type: "password" },
      },
      async authorize(credentials) {
        const user = {
          id: 1,
          name: "Admin",
          email: "admin@example.com",
        };
        if (
          credentials.email === "admin@example.com" &&
          credentials.password === "123456"
        ) {
          return user;
        }
        return null;
      },
    }),
  ],
  pages: {
    signIn: "/login",
  },
  session: {
    strategy: "jwt",
  },
  secret: process.env.NEXTAUTH_SECRET,
});

export { handler as GET, handler as POST };

🔐 Gunakan variabel .env
NEXTAUTH_SECRET=anylongsecurestring


🧾 2. Buat Halaman Login

File: app/login/page.jsx

'use client';

import { signIn } from 'next-auth/react';
import { useState } from 'react';

export default function LoginPage() {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');

  const handleLogin = async (e) => {
    e.preventDefault();
    await signIn('credentials', {
      email,
      password,
      callbackUrl: '/',
    });
  };

  return (
    <form onSubmit={handleLogin} className="max-w-md mx-auto space-y-4">
      <input
        type="email"
        placeholder="Email"
        onChange={(e) => setEmail(e.target.value)}
        className="border p-2 w-full"
      />
      <input
        type="password"
        placeholder="Password"
        onChange={(e) => setPassword(e.target.value)}
        className="border p-2 w-full"
      />
      <button type="submit" className="bg-blue-600 text-white px-4 py-2">
        Masuk
      </button>
    </form>
  );
}

🔒 3. Proteksi Halaman dengan Session

File: app/dashboard/page.jsx

import { getServerSession } from 'next-auth';
import { authOptions } from '../api/auth/[...nextauth]/route';

export default async function DashboardPage() {
  const session = await getServerSession(authOptions);

  if (!session) {
    return <p>Akses ditolak. Silakan login terlebih dahulu.</p>;
  }

  return (
    <div>
      <h1>Selamat datang, {session.user.name}</h1>
    </div>
  );
}

🧪 4. Autentikasi Manual dengan JWT (Alternatif)

Kalau kamu ingin autentikasi tanpa NextAuth (misal integrasi backend Laravel/PHP), kamu bisa:

a. Kirim email dan password ke backend (POST)

await fetch('/api/login', {
  method: 'POST',
  body: JSON.stringify({ email, password }),
});

b. Simpan token dari backend ke localStorage

localStorage.setItem('token', token);

c. Sertakan token dalam fetch API

await fetch('/api/posts', {
  headers: {
    Authorization: `Bearer ${token}`,
  },
});

⚠️ Pastikan token disimpan aman dan disetel saat logout.


💡 Best Practice Autentikasi di Next.js

FiturRekomendasi
Login & logoutGunakan NextAuth.js atau JWT custom
Proteksi halamanGunakan getServerSession() untuk SSR
Persistensi sessionStrategy: JWT
Social login (Google/GitHub)Bisa ditambahkan via NextAuth provider

🔧 Elektra Network Vision – Solusi Autentikasi Aman & Fleksibel

Kami dapat membantu:

🌐 Kunjungi elektranetworkvision.com untuk konsultasi teknis dan audit keamanan aplikasi Anda.

Leave a Reply

Your email address will not be published. Required fields are marked *