Kamis, 28 November 2019

PHP Lumen Authentication




Lumen adalah Micro-framework yang diciptakan pengembang Laravel untuk mengakomodasi kebutuhan developer yang ingin membuat aplikasi dalam skala lebih kecil dari Laravel. Karena banyak library yang dihilangkan dalam bundle source code, Lumen bisa dijadikan framework untuk membuat REST API.

Deskripsi
Tutorial ini melanjutkan project dari tutorial sebelum nya dengan nama ‘PHP Lumen Validation
and Error Handling’. Pada tutorial ini kita akan menambahkan fungsi autentikasi. Tujuan praktek
ini adalah untuk:
1. Mampu implementasi autentikasi menggunakan Lumen
2. Mampu membuat fungsi login
3. Mampu membuat fungsi register

Prasyarat

Harus menyelesaikan dulu modul dengan judul ‘PHP Lumen Validation and Error Handling’.

Membuat Table users

Jika sebelumnya sudah membuat table users, step ini bisa dilewati.
Untuk membuat table users, mari kita ikuti langkah-langkah berikut ini:
1. Membuat database migration dengan menjalankan command dibawah ini pada terminal:
php artisan make:migration create_users_table




2. Buka file database/migrations/...create_users_table.php, dan ubah menjadi seperti ini

3. Jalankan command dibawah ini pada terminal:
php artisan migrate

4. Kemudian insert satu row ke table users

5. Selesai



Membuat Model User

Untuk membuat model user, ikuti langkah-langkah dibawah ini:

1. Buat file baru dengan nama app/Models/User.php, codenya seperti ini.

2.Selesai.



Endpoint
Saat ini kita sudah mengimplementasikan endpoint yang akan kita gunakan, yakni seperti ini:



Membuat Fungsi Register

Implementasi fungsi ini adalah fungsi index di PostsController.php:

1. Buka file routes/web.php, tambahkan code ini.




2. Buat file baru app/Http/Controllers/AuthController.php, code nya seperti ini.




3. Mari kita test dengan menggunakan Postman. Negative case.




4. Mari kita test dengan menggunakan Postman. Positive case.

5.Selesai.



Instalasi dan Konfigurasi JWT untuk Lumen

Ketika kita login, maka kita akan mengembalikan Token login yang bisa digunakan sebagai
penanda sesi Login. Untuk membuat Token ini, kita akan menggunakan plugin JWT untuk
Lumen. Mari kita ikuti langkah-langkah dibawah ini:

1. Jalankan command di command prompt (harus connect internet).
composer require tymon/jwt-auth:dev-develop




2. Kalau berhasil, di file composer.json, akan menjadi seperti ini. Lihat line 10




3. Buka file bootstrap/app.php, ubah menjadi seperti dibawah ini. Cari block ‘Register
Service Providers’. Dalam kasus ini ada di line 80 & 83.

4. Jalankan command di command prompt.
php artisan jwt:secret

Buka file .env
Kalau berhasil bakal ada line seperti dibawah ini:
JWT_SECRET=hCTGhP85VVGaokY9qMMFSjWMnc4qcVsCfxlxFVbRBg62zfYBQiepMZFtEey5XuyV

5. Selesai



Membuat fungsi Login

Untuk membuat fungsi login, mari ikuti langkah-langkah dibawah ini.

1. Buka file bootstrap/app.php, ubah menjadi seperti ini. Cari block ‘Register
Middleware. Dalam kasus ini ada di line 63.




2. Buka file app/Models/user.php, ubah menjadi seperti ini.




3. Buat file config/auth.php, dengan code seperti ini




4. Buka file routes/web.php, cari group ‘auth’, ubah menjadi seperti ini.




5. Buka file app/Http/Controllers/AuthController.php, tambahkan code ini diatas deklarasi
Class. Lihat line 7.




6. Buka file app/Http/Controllers/AuthController.php, tambahkan function login code nya
seperti ini.




7. Test menggunakan Postman




8. Kalau email dan password nya salah, seperti ini:

9.Selesai.



Membuat Authenticated Routing

Sekarang kita akan membuat routing di bawah ini tidak bisa diakses oleh user yang belum
login.


Untuk implementasi nya mari ikuti langkah-langkah dibawah ini.




1. Buka file routes/web.php, ubah posts routing menjadi seperti ini.




2. Sekarang kalau kita akses melalui Postman, maka response nya seperti ini.




3. Mari kita tambahkan header Authorization dengan value [Bearer LOGIN_TOKEN].
Authorization ini akan digunakan sebagai sesi Login.

4. Selesai



Indentifikasi User Login Authenticated Routing

Dari Token login yang dikirim, kita bisa melakukan identifikasi user. Sebagai contoh, kita hanya
akan mengembalikan list posts berdasarkan posts.user_id = UserLogin.id. Mari ikuti
langkah-langkah dibawah ini.

1. Buka file app/Http/Controllers/PostsController.php, dan ubah menjadi seperti dibawah
ini. Lihat line 7 dan line 18.




2. Testing menggunakan Postman.

3. Selesai

Jumat, 15 November 2019

Membuat PHP Lumen Validation dan Error Handling




Lumen adalah Micro-framework yang diciptakan pengembang Laravel untuk mengakomodasi kebutuhan developer yang ingin membuat aplikasi dalam skala lebih kecil dari Laravel. Karena banyak library yang dihilangkan dalam bundle source code, Lumen bisa dijadikan framework untuk membuat REST API.

Deskripsi
Tutorial ini melanjutkan project dari tutorial sebelum nya dan syarat nya sudah menyelesaikan tutorial Membuat PHP Lumen Rest CRUD. Kita akan membuat service menggunakan PHP Lumen yang bisa melakukan handling Validation dan Negative Case. 
Tujuan praktek ini adalah untuk :
1. Mampu implementasi validation menggunakan Lumen
2. Mampu melakukan Negative Case handling menggunakan Lumen
3. Mampu memberikan informasi yang baik dan relevan ketika mengalami error validasi dan error negative case

Endpoint
Saat ini kita sudah mengimplementasikan endpoint yang akan kita gunakan, yakni seperti ini:

Beautify Response Pada Fungsi Read All
Implementasi fungsi ini adalah fungsi index di PostsController.php :




1. Saat ini kalau kita memanggil endpoint http://localhost:8000/posts, maka tampilan response nya akan menjadi seperti ini :

2. Kalau melihat dari response nya ada beberapa data yang tidak kita perlukan, seperti:
first_page_url, from, last_page, to. Pertama kita akan mengubah response nya terlebih
dahulu.




3. Buka file app/Http/Controllers/PostsController.php, ubah function index menjadi seperti ini.




Pada baris ini, nilai 2 bisa anda ubah2. Nilai ini adalah berapa jumlah rows yang akan ditampilkan dalam satu halaman.




4. Ketika kita panggil endpoint http://localhost:8000/posts, maka tampilanya seperti ini.

Kita lihat sekarang response nya menjadi lebih clean, dan lebih nyaman untuk dibaca oleh programmer. Nilai dari next_page_url pada line 5 yakni http://localhost:8000/posts?page=2, ini adalah url untuk mendapatkan rows di halaman kedua. Untuk lanjut ke halaman ke-3 dan seterus nya, kita hanya perlu mengganti parameter page=[halaman].




5. Ketika kita panggil endpoint http://localhost:8000/posts?page=2, maka hasilnya harus
berbeda dengan endpoint http://localhost:8000/posts. Seperti ini. Kita lihat
value dari next_page_url pada line 5 adalah null, karena sudah tidak ada lagi rows yang
perlu ditampilkan di halaman berikut nya.


Validasi Fungsi Create

Untuk membuat validasi pada fungsi create, mari kita ikuti langkah-langkah berikut ini:
1. Saat ini fungsi create memiliki beberapa parameter, diantaranya adalah:
    - title
    - content
    - status
    - user_id
2. Parameter tersebut belum divalidasi, artinya semua nilai bisa kita masukan ke parameter
tersebut. Kalau kita coba untuk memberikan value ‘’ pada parameter tersebut, maka
aplikasi akan tetap melakukan INSERT ke database. Sekarang kita akan melakukan validasi
untuk parameter tersebut dengan rule seperti dibawah ini :

   - title:
     a. Tidak boleh kosong (required)
     b. Harus memiliki minimum 5 karakter
   - content:
     a. Tidak boleh kosong (required)
     b. Harus memiliki minimum 10 karakter
   - status:
     a. Tidak boleh kosong (required)
     b. Hanya bisa diisi oleh dua value ini: published dan draft
   - user_id:
     a. Tidak boleh kosong (required)
     b. Value yang di input harus ada di database table users
3. Itulah rule validasi yang akan kita implementasikan.
4. Kita akan melakukan pengecekan pada semua parameter, jika validasi lolos maka kita
akan melanjutkan untuk INSERT ke database.
5. Jika validasi tidak lolos, kita akan memberikan response error dengan status code 400
Bad Request.

Membuat Table users
Untuk membuat table users, mari kita ikuti langkah-langkah berikut ini:
1. Membuat database migration dengan menjalankan command dibawah ini pada terminal:
     php artisan make:migration create_users_table




2. Buka file database/migrations/...create_users_table.php, dan ubah menjadi seperti ini :

3. Jalankan command dibawah ini pada terminal:
    php artisan migrate

4. Kemudian insert satu row ke table users


Implementasi Validasi Fungsi Create
Untuk implementasi validasi pada fungsi create, mari kita ikuti langkah-langkah berikut ini:




1. Buka file app/Http/Controllers/PostsController.php, ubah function store menjadi seperti ini :




2. Kita coba dengan mengirimkan parameter null, seperti ini :




3. Kita coba dengan mengisi parameter yang tidak valid




4. Kita coba dengan mengisi parameter yang valid


Implementasi Validasi Fungsi Update
Untuk implementasi validasi pada fungsi update, mari kita ikuti langkah-langkah berikut ini :




1. Buka file app/Http/Controllers/PostsController.php, ubah function update menjadi seperti ini.




2. Kita coba kirim dengan value null




3. Kita coba dengan value yang tidak valid




4. Kita coba dengan value yang valid


Gambaran Umum Error Handling


Saat ini kita hanya fokus pada positive case saja, kita belum memikirkan apabila ada negative case. Kita tidak menghiraukan apakah request parameter yang dikirim sudah sesuai dengan yang kita harapkan atau belum. Bagaimana seandainya user mengirim request dengan Method yang salah? Bagaimana apabila ID yang dikirim tidak ada di database ketika melakukan UpdateDelete atau Show? Pada dasarnya Lumen sudah menyediakan Error Handling untuk menangani masalah tersebut. Sebagai contoh, jika kita mengakses http://localhost:8000/posts/1 dengan method POST, maka Lumen akan mengembalikan error response Invalid Method seperti gambar ini.

Kenapa ini terjadi? Karena di file routes/web.php, kita mendefinisikan url ini
http://localhost:8000/posts/5 hanya menerima method GETPUT dan DELETE.

Error response yang diberikan oleh Lumen secara default dalam bentuk HTML. Sekarang kita akan melakukan Error handling dan memberikan response JSON.


Implementasi Error Handling
Untuk implementasi Error Handling, mari kita ikuti langkah-langkah berikut ini:




1. Sebetulnya kita sudah melakukan error handling, lihat pada function show, update dan
destroy, kita akan menemukan code seperti dibawah ini :

2. Fungsi abort(404) diatas (contoh pada function show) adalah salah satu implementasi
error handling. Hanya saja implementasi ini belum memberikan error response JSON,
masih berbentuk HTML yang merupakan fungsi bawaan dari Lumen.




3. Sebagai contoh kalau kita panggil endpoint GET http://localhost:8000/post/6, maka
tampilannya akan seperti ini :

4. Sekarang kita akan mengubah response tersebut menjadi response dalam bentuk JSON.




5. Buka file app/Exceptions/Handler.php diatas Class definition tambahkan code dibawah
ini.




6. Buka file app/Exceptions/Handler.php ubah function render menjadi seperti dibawah ini :




7. Buka file .env ubah APP_DEBUG=true manjadi APP_DEBUG=false

8. Restart server




9. Ketika kita panggil endpoint POST http://localhost:8000/post/6, maka tampilannya
akan seperti ini :




10. kita panggil endpoint GET http://localhost:8000/post/6, maka tampilannya akan seperti ini :