Setelah di part sebelumnya kita berhasil membuat endpoint Register dan Login yang menghasilkan JWT token, sekarang saatnya kita pakai token tersebut untuk melindungi endpoint tertentu — dalam kasus ini endpoint Create, Update, dan Delete Post — supaya hanya user yang sudah login yang bisa mengaksesnya.
Membuat Middleware
Buat file baru app/http/middleware/jwt_middleware.go:
package middleware
import (
"myblog/app/helpers"
"strings"
"github.com/goravel/framework/contracts/http"
)
func JwtMiddleware() http.Middleware {
return func(ctx http.Context) {
authHeader := ctx.Request().Header("Authorization", "")
if authHeader == "" {
ctx.Request().AbortWithStatusJson(http.StatusUnauthorized, http.Json{
"error": "Authorization header is required",
})
return
}
parts := strings.SplitN(authHeader, " ", 2)
if len(parts) != 2 || strings.ToLower(parts[0]) != "bearer" {
ctx.Request().AbortWithStatusJson(http.StatusUnauthorized, http.Json{
"error": "Authorization header format must be Bearer {token}",
})
return
}
claims, err := helpers.ValidateJWT(parts[1])
if err != nil {
ctx.Request().AbortWithStatusJson(http.StatusUnauthorized, http.Json{
"error": "Invalid or expired token",
})
return
}
ctx.WithValue("user_id", claims.UserID)
ctx.Request().Next()
}
}
Alur middleware ini kurang lebih:
- Ambil header
Authorizationdari request. Kalau tidak ada, langsung abort dengan status401 Unauthorized. - Header harus berformat
Bearer {token}— kalau formatnya salah, abort juga dengan401. - Token divalidasi menggunakan
helpers.ValidateJWTyang sudah kita buat di part sebelumnya. Kalau token tidak valid atau sudah expired, request di-abort. - Kalau semua pengecekan lolos,
user_iddari token disimpan ke context request (ctx.WithValue) supaya bisa dipakai di controller nanti, lalu request dilanjutkan ke handler berikutnya lewatctx.Request().Next().
Menerapkan Middleware ke Route
Sekarang bungkus route Create, Update, dan Delete post dengan middleware ini di routes/api.go:
package routes
import (
"github.com/goravel/framework/contracts/route"
"github.com/goravel/framework/facades"
"myblog/app/http/controllers"
"myblog/app/http/middleware"
)
func Api() {
userController := controllers.NewUserController()
facades.Route().Post("/register", userController.Register)
facades.Route().Post("/login", userController.Login)
facades.Route().Get("/users/{id}", userController.Show)
postContoller := controllers.NewPostController()
facades.Route().Get("/posts", postContoller.Index)
facades.Route().Get("/posts/{id}", postContoller.Show)
facades.Route().Middleware(middleware.JwtMiddleware()).Group(func(router route.Router) {
router.Post("/posts", postContoller.Store)
router.Put("/posts/{id}", postContoller.Update)
router.Delete("/posts/{id}", postContoller.Destroy)
})
}
Endpoint GET /posts dan GET /posts/{id} sengaja kita biarkan publik — siapa saja boleh membaca daftar dan detail post tanpa login. Tapi untuk POST, PUT, dan DELETE, kita bungkus dalam facades.Route().Middleware(middleware.JwtMiddleware()).Group(...), sehingga request wajib menyertakan token JWT yang valid di header Authorization.
Testing Endpoint
Coba akses POST /posts tanpa header Authorization — akan mendapat response 401 Unauthorized. Setelah itu, login dulu lewat POST /login untuk mendapatkan token, lalu sertakan token tersebut di header:
Authorization: Bearer {token_hasil_login}
Kalau token valid, endpoint create/update/delete post sekarang bisa diakses seperti biasa.
Penutup
Sampai di part ini kita sudah punya REST API blog sederhana dengan Goravel yang lengkap dengan: routing, database (migration, model, seeder), endpoint CRUD, validasi input, autentikasi (register, login), sampai proteksi endpoint pakai JWT middleware. Materi selanjutnya akan membahas topik lanjutan lain seperti pagination, relasi antar model, dan fitur comment — jadi tetap ikuti seri ini!
Video Tutorial
Tutorial dalam bentuk video dapat di akses di channel Youtube IndoKoding: https://www.youtube.com/watch?v=Bf6LIGj0vFg
Bagian dari Series: Seri Tutorial Belajar Framework Goravel Rest API untuk Pemula
Overview Seri ini membahas cara membangun REST API menggunakan Goravel, framework web berbasis Golang yang terinspirasi dari Laravel. Materi mencakup...
Lihat Series Lengkap