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:
- API key valid (
1234567890
): Mengharapkan status code200 OK
. - API key tidak valid (
invalid-api-key
): Mengharapkan status code401 Unauthorized
. - 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!