pemrograman

14 Membuat Middleware Api Key Authentication Pada Golang

API (Application Programming Interface) memainkan peranan yang sangat penting dalam menghubungkan berbagai aplikasi atau layanan. Untuk memastikan aplikasi Anda tetap aman dan terhindar dari akses yang tidak sah, penggunaan metode autentikasi seperti API Key Authentication sangatlah penting. Dalam artikel ini, kita akan membahas langkah demi langkah cara membuat middleware API Key Authentication menggunakan httprouter di Golang dan menambahkan unit test untuk setiap fungsi guna memastikan fungsionalitasnya bekerja dengan baik.

Apa itu Middleware API Key Authentication?

Middleware adalah komponen perangkat lunak yang ditempatkan di antara server dan aplikasi yang memproses request HTTP. Dalam konteks API, middleware API Key Authentication memeriksa setiap request untuk memastikan bahwa permintaan tersebut memiliki API key yang valid. Hal ini mencegah penyalahgunaan layanan API dengan membatasi akses hanya pada aplikasi yang terdaftar.

Middleware akan memeriksa apakah header API-Key yang dikirim dalam request sesuai dengan API key yang valid. Jika tidak valid, request akan dibatalkan dengan status 401 Unauthorized.

Langkah-langkah Membuat Middleware API Key Authentication

Berikut adalah cara membuat middleware API Key Authentication dengan httprouter di Golang, lengkap dengan unit test untuk setiap fungsi yang digunakan.

1. Install Library httprouter

Jika belum terinstall, Anda bisa menambahkan library httprouter dengan menjalankan perintah berikut:

go get github.com/julienschmidt/httprouter

2. Struktur Proyek

Struktur direktori proyek yang sederhana adalah seperti ini:

/go-api-key-auth
    /main.go
    /middleware.go
    /middleware_test.go

File main.go adalah entry point aplikasi, sementara middleware.go akan berisi logika API key authentication, dan middleware_test.go akan berisi unit test.

3. Implementasi Middleware

Langkah pertama adalah membuat middleware API Key Authentication yang akan memvalidasi API key.

middleware.go

package main

import (
	"net/http"
	"github.com/julienschmidt/httprouter"
)

// validAPIKey adalah API key yang dianggap valid
const validAPIKey = "1234567890"

// APIKeyMiddleware adalah fungsi middleware untuk memverifikasi API Key dalam request
func APIKeyMiddleware(next httprouter.Handle) httprouter.Handle {
	return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
		apiKey := r.Header.Get("API-Key")

		// Jika API key tidak ada atau tidak valid
		if apiKey != validAPIKey {
			http.Error(w, "Unauthorized", http.StatusUnauthorized)
			return
		}

		// Lanjutkan ke handler berikutnya jika API key valid
		next(w, r, ps)
	}
}

// protectedEndpoint adalah endpoint yang dilindungi oleh API key
func protectedEndpoint(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
	w.Write([]byte("Access granted to protected endpoint!"))
}

4. Implementasi Main Function

Sekarang kita buat main function untuk menjalankan server dan menambahkan routing untuk endpoint yang dilindungi.

main.go

package main

import (
	"log"
	"net/http"
	"github.com/julienschmidt/httprouter"
)

func main() {
	router := httprouter.New()

	// Menambahkan middleware untuk endpoint yang dilindungi
	router.GET("/protected", APIKeyMiddleware(protectedEndpoint))

	// Jalankan server
	log.Fatal(http.ListenAndServe(":8080", router))
}

5. Membuat Unit Test

Setelah mengimplementasikan middleware, kita perlu menambahkan unit test untuk memverifikasi fungsionalitas kode tersebut. Unit test ini akan memastikan bahwa API key divalidasi dengan benar dan endpoint memberikan respons yang sesuai.

middleware_test.go

package main

import (
	"net/http"
	"net/http/httptest"
	"testing"
	"github.com/julienschmidt/httprouter"
)

// Unit test untuk middleware APIKeyMiddleware
func TestAPIKeyMiddleware(t *testing.T) {
	// Membuat instance router
	router := httprouter.New()

	// Menambahkan handler yang dilindungi dengan middleware
	router.GET("/protected", APIKeyMiddleware(protectedEndpoint))

	tests := []struct {
		apiKey       string
		expectedCode int
	}{
		{"1234567890", http.StatusOK}, // API key valid
		{"invalid-api-key", http.StatusUnauthorized}, // API key tidak valid
		{"", http.StatusUnauthorized}, // API key kosong
	}

	for _, tt := range tests {
		t.Run(tt.apiKey, func(t *testing.T) {
			req, err := http.NewRequest("GET", "/protected", nil)
			if err != nil {
				t.Fatal(err)
			}
			// Menambahkan API Key ke header request
			req.Header.Set("API-Key", tt.apiKey)

			// Membuat recorder untuk menangkap respon
			rr := httptest.NewRecorder()

			// Menjalankan handler
			router.ServeHTTP(rr, req)

			// Memeriksa status code
			if rr.Code != tt.expectedCode {
				t.Errorf("Expected status %v, got %v", tt.expectedCode, rr.Code)
			}
		})
	}
}

Penjelasan Unit Test

Unit test di atas melakukan pengujian terhadap middleware API Key. Ada tiga skenario yang diuji:

  1. API key valid (1234567890): Mengharapkan status code 200 OK.
  2. API key tidak valid (invalid-api-key): Mengharapkan status code 401 Unauthorized.
  3. API key kosong: Mengharapkan status code 401 Unauthorized.

Untuk menjalankan unit test, jalankan perintah berikut di terminal:

go test -v

Jika semua pengujian berhasil, Anda akan melihat output seperti ini:

=== RUN   TestAPIKeyMiddleware
--- PASS: TestAPIKeyMiddleware (0.00s)
PASS
ok  	<your-package-name>	0.004s

6. Menjalankan Server

Untuk menjalankan server, Anda dapat mengetikkan perintah berikut di terminal:

go run main.go

Kemudian, akses API yang dilindungi menggunakan curl atau alat HTTP lainnya.

Kesimpulan

Dengan mengikuti tutorial ini, Anda telah berhasil membuat middleware API Key Authentication menggunakan httprouter di Golang. Anda juga telah mengimplementasikan unit test untuk memastikan bahwa middleware dan logika aplikasi Anda berfungsi dengan benar. Menggunakan middleware seperti ini sangat penting dalam menjaga keamanan aplikasi API Anda dari akses yang tidak sah.

Untuk memperdalam pemahaman tentang Golang, Anda dapat mengunjungi artikel-artikel terkait berikut ini:

Dengan demikian, Anda siap untuk memulai pembangunan API yang lebih aman dan robust!

comments powered by Disqus