M
Mr Sugiarto
Developer
21 Aug 2026 3 min read

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:

  1. Ambil header Authorization dari request. Kalau tidak ada, langsung abort dengan status 401 Unauthorized.
  2. Header harus berformat Bearer {token} — kalau formatnya salah, abort juga dengan 401.
  3. Token divalidasi menggunakan helpers.ValidateJWT yang sudah kita buat di part sebelumnya. Kalau token tidak valid atau sudah expired, request di-abort.
  4. Kalau semua pengecekan lolos, user_id dari token disimpan ke context request (ctx.WithValue) supaya bisa dipakai di controller nanti, lalu request dilanjutkan ke handler berikutnya lewat ctx.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

M
Mr Sugiarto

Developer

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