Membuat GraphQL server dengan Apollo, Express dan autentikasi JWT
Apollo (GraphQL) Server adalah salah satu GraphQL server yang mengikuti spesifikasi GraphQL dan kompatibel dengan berbagai macam GraphQL Client. Express.js adalah salah satu web framework pada pada Node.js. Kali ini kita akan melakukan implementasi GraphQL server dengan Apollo sebagai middleware pada Express (Node.js)
Implementasi
Project Overview
Pada project ini akan digunakan data dummy dalam bentuk array yang tersimpan dalam file .js pada direktori data. Ada 3 macam entitas data, namun hanya pada entitas author dan book yang bisa dilakukan operasi CRUD melalui GraphQL. Entitas user digunakan untuk autentikasi dan otorisasi saja.
Berikut adalah struktur direktori dari project yang dibuat :
Dependensi
Berikut adalah dependensi yang digunakan dalam project ini.
"dependencies": {
"@apollo/server": "^4.10.4",
"body-parser": "^1.20.2",
"cors": "^2.8.5",
"graphql": "^16.8.1",
"jsonwebtoken": "^9.0.2"
}
Environment
Kemudian untuk development environment adalah sebagai berikut.
$ node -v
v.22.0.0
$ npm -v
10.5.1
Schema
Pada bagian schema graphql, akan ada 3 tipe object yang akan didefinisikan, yaitu :
- Query : untuk operasi pengambilan (query) data
- Mutation : untuk operasi pengubahan data
- Input : untuk struktur input data dalam operasi ubah data
Pada project ini akan ada 2 entitas yang digunakan, yaitu Book dan Author.
Resolver
Pada bagian resolver, operasi data dilakukan melalui function dari service untuk masing - masing entitas. Pada bagian mutation ada pengecekan otoritas sebelum operasi data. Sehingga user perlu melakukan autentikasi untuk sebelum operasi ubah data.
Controller
Pada bagian controller, hanya akan ada function untuk melakukan login.
Helper / Utils
Pada bagian helper, akan berisi implementasi logic untuk melakukan autentikasi dan otorisasi.
Custom Error
Pada project ini juga didefinisikan exception berupa graphql custom error, yang bisa ditampilkan ketika terjadi kesalahan dalam proses autentikasi atau otorisasi.
Entry Point
Pada bagian ini dilakukan setup untuk berbagai hal terkait server, mulai dari inisiasi http server, hingga setup GraphQL Server sebagai middleware dalam express.js.
Testing
Authentication
Berikut adalah proses autentikasi yang dilakukan dengan Postman. Autentikasi dilakukan dengan mengakses endpoint login dan dengan mengirimkan data berupa username dan password. Lalu akan mendapatkan bearer token jika sukses. Token ini akan diperlukan ketika akan melakukan mutation atau perubahan data melalui graphql.
Query - All Author
Pada gambar di bawah adalah contoh proses operasi query graphql dari data daftar Author yang dilakukan melalui sandbox.
Query - Selected Author
Pada gambar di bawah adalah contoh proses operasi query graphql dari data salah satu Author yang dilakukan melalui sandbox.
Mutation - Create Author
Pada gambar di bawah adalah contoh proses operasi mutation graphql untuk menambahkan data Author baru yang dilakukan melalui sandbox.
Untuk melakukan proses mutation diperlukan menyertakan bearer token yang didapat setelah melakukan proses autensikasi. Token tersebut, disertakan sebagai value dari header Authorization.
Jika tidak menyertakan token yang valid, maka ketika melakukan operasi mutation akan muncul error seperti berikut.
Mutation - Update Author
Pada gambar di bawah adalah contoh proses operasi mutation graphql untuk mengubah data Author yang dilakukan melalui sandbox.
Mutation - Delete Author
Pada gambar di bawah adalah contoh proses operasi mutation graphql untuk menghapus data Author yang dilakukan melalui sandbox.
Penutup
Kata Penutup
Apollo GraphQL Server bisa diimplementasikan pada Express.js (Node.js) sebagai middleware. Dengan demikian, maka express dapat berlaku sebagai server GraphQL sekaligus sebagai API Server konvensional. Semoga tulisan kali ini bermanfaat. Sampai jumpa di tulisan selanjutnya. Salam.