ASP.NET Core API #11: Membuat Fitur Login Sederhana (Tanpa JWT dan Tanpa Hashing)

ASP.NET Core API #11: Membuat Fitur Login Sederhana (Tanpa JWT dan Tanpa Hashing)

Halo lagi, calon developer API! 👋

Di artikel-artikel sebelumnya kita sudah membuat API wisata yang keren dengan CRUD dan upload gambar. Tapi kita belum punya sistem login yang sederhana. Nah, di artikel ini kita akan membuat fitur login yang sangat sederhana: hanya membandingkan username dan password yang dikirim dengan data di database, tanpa JWT, tanpa hashing. Password disimpan sebagai plain text (teks asli). Tentu ini TIDAK AMAN untuk production, tapi sangat cocok untuk belajar memahami alur autentikasi dasar sebelum masuk ke yang lebih rumit.

🤣 Kenapa password disimpan plain text? Biar gampang diingat, tapi gampang juga dibajak! Jadi jangan dipakai di aplikasi beneran ya! 😆

Apa yang Akan Kita Buat?

  • Menambahkan model User dengan kolom Username dan Password (plain text).
  • Membuat tabel Users di database (migration).
  • Menambahkan endpoint POST /api/auth/login yang menerima username dan password.
  • Endpoint akan mencari user di database berdasarkan username dan mencocokkan password (string equality).
  • Jika cocok, mengembalikan pesan sukses beserta data user (tanpa token). Jika tidak, mengembalikan error.

Langkah 1: Menambahkan Model User

Buka project WisataAPI di Visual Studio. Buat folder Models jika belum ada. Tambahkan class baru bernama User.cs:

using System.ComponentModel.DataAnnotations;

namespace WisataAPI.Models
{
    public class User
    {
        [Key]
        public int Id { get; set; }

        [Required]
        [MaxLength(50)]
        public string Username { get; set; }

        [Required]
        [MaxLength(100)]
        public string Password { get; set; } // Disimpan sebagai plain text (TIDAK AMAN!)
    }
}
⚠️ PERINGATAN: Menyimpan password sebagai plain text adalah praktik yang sangat buruk. Jangan pernah lakukan ini di aplikasi nyata! Ini hanya untuk tujuan pembelajaran.

Langkah 2: Menambahkan DbSet ke DbContext

Buka WisataDbContext.cs dan tambahkan properti DbSet<User>:

public DbSet<User> Users { get; set; }

Langkah 3: Membuat Migration untuk Tabel Users

Buka Package Manager Console (Tools → NuGet Package Manager → Package Manager Console). Pastikan project default adalah WisataAPI. Jalankan perintah:

Add-Migration AddUsersTablePlainText
Update-Database

Ini akan membuat tabel Users di database dengan kolom Id, Username, Password.

Langkah 4: Menambahkan Data User Contoh (Manual)

Kita perlu memasukkan beberapa user contoh ke database. Bisa melalui SQL Server Management Studio atau menambahkan seeder. Untuk sederhana, kita tambahkan manual via SSMS:

INSERT INTO Users (Username, Password) VALUES 
('admin', 'admin123'),
('joko', 'rahasia'),
('siti', 'wisata123');

Atau jika mau, kita bisa buat endpoint register sederhana nanti.

Langkah 5: Membuat DTO untuk Login

Buat folder DTOs jika belum ada. Tambahkan class LoginDto.cs:

namespace WisataAPI.DTOs
{
    public class LoginDto
    {
        public string Username { get; set; }
        public string Password { get; set; }
    }
}

Kita juga butuh response setelah login sukses. Buat LoginResponseDto.cs:

namespace WisataAPI.DTOs
{
    public class LoginResponseDto
    {
        public int Id { get; set; }
        public string Username { get; set; }
        public string Message { get; set; }
    }
}

Langkah 6: Membuat AuthController dengan Endpoint Login

Buat controller baru: AuthController.cs di folder Controllers. Isinya:

using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using WisataAPI.Data;
using WisataAPI.DTOs;
using WisataAPI.Models;

namespace WisataAPI.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AuthController : ControllerBase
    {
        private readonly WisataDbContext _context;

        public AuthController(WisataDbContext context)
        {
            _context = context;
        }

        // POST: api/auth/login
        [HttpPost("login")]
        public async Task<IActionResult> Login(LoginDto loginDto)
        {
            // Cari user berdasarkan username
            var user = await _context.Users
                .FirstOrDefaultAsync(u => u.Username == loginDto.Username);

            if (user == null)
            {
                return Unauthorized(new { message = "Username atau password salah." });
            }

            // Bandingkan password (plain text!)
            if (user.Password != loginDto.Password)
            {
                return Unauthorized(new { message = "Username atau password salah." });
            }

            // Login sukses
            var response = new LoginResponseDto
            {
                Id = user.Id,
                Username = user.Username,
                Message = "Login berhasil."
            };

            return Ok(response);
        }
    }
}

Perhatikan: kita tidak menggunakan JWT, hanya mengembalikan data user. Di aplikasi nyata, kita akan mengembalikan token, tapi ini hanya contoh sederhana.

Langkah 7: Uji Coba dengan Postman

Jalankan API (F5). Buka Postman.

1. Uji Login dengan data benar

  • Method: POST
  • URL: https://localhost:7000/api/auth/login (sesuaikan port)
  • Body: rawJSON
{
    "username": "joko",
    "password": "rahasia"
}

Klik Send. Harusnya response:

{
    "id": 2,
    "username": "joko",
    "message": "Login berhasil."
}

2. Uji dengan password salah

{
    "username": "joko",
    "password": "salah"
}

Response: 401 Unauthorized dengan pesan error.

3. Uji dengan username tidak ada

{
    "username": "abc",
    "password": "rahasia"
}

Response: 401 Unauthorized.

💡 Karena kita mengembalikan 401, client bisa menangkapnya dan menampilkan pesan error.

Langkah 8: (Opsional) Menambahkan Endpoint Register Sederhana

Untuk memudahkan menambah user, kita bisa buat endpoint register. Tambahkan di AuthController:

[HttpPost("register")]
public async Task<IActionResult> Register(RegisterDto registerDto)
{
    // Cek apakah username sudah ada
    if (await _context.Users.AnyAsync(u => u.Username == registerDto.Username))
    {
        return BadRequest(new { message = "Username sudah digunakan." });
    }

    var user = new User
    {
        Username = registerDto.Username,
        Password = registerDto.Password // plain text!
    };

    _context.Users.Add(user);
    await _context.SaveChangesAsync();

    return Ok(new { message = "Registrasi berhasil." });
}

Buat juga RegisterDto.cs:

public class RegisterDto
{
    public string Username { get; set; }
    public string Password { get; set; }
}

Uji coba register dengan Postman. Ingat, password tetap plain text.

Mengapa Ini Tidak Aman?

  • Password disimpan sebagai teks asli, sehingga jika database bocor, semua password terlihat.
  • Tidak ada perlindungan terhadap serangan seperti brute force atau rainbow table.
  • Tidak ada mekanisme token, sehingga client harus mengirim username dan password setiap kali (sangat tidak aman).

Di artikel berikutnya (#12) kita akan meningkatkan keamanan dengan hashing password (BCrypt) tanpa JWT, lalu di artikel #7 dan #8 kita sudah belajar JWT. Jadi ini adalah langkah dasar.

Selamat! Kamu Punya Fitur Login Sederhana

Sekarang API-mu bisa menerima login dengan username dan password plain text. Ingat, ini hanya untuk pembelajaran. Jangan gunakan di aplikasi nyata!

Rangkuman

  • Model User dengan password plain text.
  • Migration untuk tabel Users.
  • Endpoint POST /api/auth/login membandingkan username dan password secara langsung.
  • Response sukses mengembalikan data user (tanpa token).
  • Kelemahan: password tidak di-hash, tidak ada token.

Selanjutnya?

Di artikel berikutnya (ASP.NET Core API #12: Membuat Fitur Login dengan Hashing Password (BCrypt) Tanpa JWT), kita akan meningkatkan keamanan dengan menyimpan password yang sudah di-hash menggunakan BCrypt. Sampai jumpa!

😎 Jangan lupa, password plain text itu kayak celana bolong — keliatan banget isinya! Nanti kita perbaiki di artikel selanjutnya.

Ditulis oleh Kakak programmer yang dulu juga pernah menyimpan password asli di database. Kalau ada pertanyaan, tulis di komentar ya!

📋 DAFTAR ISI LENGKAP SERI ASP.NET CORE API
🔹 ASP.NET Core API #1: Persiapan Lingkungan dan Instalasi Tools 🔹 ASP.NET Core API #2: Membuat Project API Pertama dan Menampilkan Hello World 🔹 ASP.NET Core API #3: Mendesain Database Wisata – Tabel Kategori dan Daftar Wisata 🔹 ASP.NET Core API #4: Menghubungkan API dengan Database Menggunakan Entity Framework Core 🔹 ASP.NET Core API #5: Membuat CRUD untuk Kategori Wisata (GET, POST, PUT, DELETE) 🔹 ASP.NET Core API #6: Membuat CRUD untuk Daftar Wisata dengan Relasi Kategori 🔹 ASP.NET Core API #7: Menambahkan Fitur Login dan Registrasi dengan JWT 🔹 ASP.NET Core API #8: Mengamankan Endpoint API Menggunakan Token JWT 🔹 ASP.NET Core API #9: (Bonus) Upload Gambar untuk Daftar Wisata 🔹 ASP.NET Core API #10: Deployment API ke IIS atau Azure 🔹 ASP.NET Core API #11: Membuat Fitur Login Sederhana (Tanpa JWT dan Tanpa Hashing) 🔹 ASP.NET Core API #12: Membuat Fitur Login dengan Hashing Password (BCrypt) Tanpa JWT
✨ Klik judul untuk membaca artikel
Lebih baru Lebih lama

نموذج الاتصال