Cerita ini bermula dari tulisan integrasi custom OAuth2 dengan Moodle menggunakan Laravel Passport. Terdapat masalah (bug) saat menggunakan mekanisme Authorization Code Flow di Laravel Passport.
Mari kita ibaratkan Moodle sebagai penyedia layanan (Service Provider) dan OAuth2 ini sebagai penyedia identitas (Indentity Provider). Moodle dengan situs moodle.tld
dan OAuth2 dengan situs oauth2.tld
.
Apa? OAuth2 sebagai penyedia identitas? Ya, kamu ngga salah baca. Sebenarnya yang benar adalah menggunakan OpenID Connect (Semacam lapisan kecil untuk di atas OAuth2). Cuma, demi kenyamanan bersama saya anggap OAuth2 sebagai penyedia identitas.
Jika Anda penasaran apa bedanya OAuth2 dengan OpenID Connect silakan tonton video berjudul “An Illustrated Guide to OAuth and OpenID Connect” dari tim Okta Dev.
Kembali ke topik, jadi begini kondisi sebelumnya yang terjadi ketika menghubungkan melakukan autentikasi di Moodle dengan custom OAuth2.
Kondisi ini terjadi dalam satu tab di browser
- Pengguna menuju ke halaman login moodle
moodle.tld/login
. - Pengguna mengklik tombol login
Testing OAuth
. - Pengguna diarahkan ke website OAuth2 untuk menuju ke halaman persetujuan. Namun, karena pengguna belum login ke website OAuth2 maka di arahkan ke halaman login oauth2
oauth2.tld/login
. - Setelah berhasil login ke website OAuth2, mestinya pengguna diarahkan ke halaman persetujuan seperti gambar di bawah.

Namun, yang terjadi adalah pengguna tidak diarahkan ke halaman persetujuan tersebut dan malah diarahkan ke halaman utama OAuth setelah login sehingga proses menuju ke halaman persetujuan terputus di tengah jalan. 😭
- Akhirnya, pengguna mengulang ke halaman login moodle
moodle.tld/login
. - Pengguna mengulang klik tombol login
Testing OAuth
. - Karena pengguna sudah login di langkah sebelumnya maka langsung diarahkan ke halaman persetujuan apakah Moodle diijinkan untuk mendapatkan akses identitas milik kita dari OAuth2 server.
- Pengguna mengklik tombol
Autorize
untuk memberikan ijin Moodle mendapatkan data identitas kita.

- Pengguna di arahkan ke halaman pengguna Moodle
moodle.tld/my
.
Di atas membutuhkan 9 langkah untuk login ke Moodle menggunakan OAuth2. Hal yang mengganjal terjadi pada langkah ke-empat. Jika kita berhasil memperbaiki bug di masalah otorisasi di Laravel Passport maka hanya dibutuhkan 6 langkah saja.
Pertama, kita analisa tautan mengarah ke halaman persetujan.
Tautannya seperti di bawah ini.
|
|
Kita cek di Laravel Passport, apakah ada middleware yang menunggangi tautan oauth/authorize
?
Kita jalankan perintah php artisan route:list
dan ternyata tautan oauth/authorize
ditunggangi oleh middlewre web
dan auth
. Kita fokus ke middleware auth
karena dia bertugas sebagai pencegat jika user belum login maka akan diarahkan ke tautan login
.

Middleware auth
berasal dari file Authenticate.php yang terletak pada direktori app/Http/Middleware/Authenticate.php
. Kita perhatikan isi method redirectTo()
.
|
|
Kalau request di atas tidak meminta respon berupa JSON maka arahkan ke tautan login
. Dari sinilah kita bisa membedah isi dari method redirectTo()
menjadi seperti di bawah ini.
|
|
- Cek apakah request yang dituju bukan meminta respon JSON?
- Jika iya, cek apakah path url nya adalah
oauth/authorize
? - Jika benar, cek apakah ada query param bernama
client_id
? - Jika ada, buat sebuah array bernama
$params
yang isinya adalahclient_id
danreturn_to
. - Kemudian, tempelkan sebagai query string param di route login
route('login', $params)
. Sehingga jadinya seperti ini:
|
|
Jika di langkah ketiga tidak ada query param bernama
client_id
maka arahkan dia ke routelogin
tanpa query string param.
Perhatikan pula bahwa route
login
di laravel ini ada dua method yakniGET dan POST
. Yang di atas mengarah ke routelogin
dengan methodGET
.
Pertama, kita override method showLoginForm()
dari file LoginController.php di direktori app/Http/Controllers/Auth/LoginController.php
. File LoginController.php ini dihasilkan dari perintah php artisan make:auth
.
|
|
Di method showLoginForm()
akan menampilkan view bernama login.blade.php yang terletak di direktori resources/views/auth/login.blade.php
dan menyisipkan data bernama request_uri
.
Nilai dari request_uri
adalah
|
|
Kedua, kita modifikasi ganti nilai dari action
pada form elemen di file login.blade.php.
|
|
Ketiga, kita perlu memodifikasi method login()
di file LoginController agar ketika user berhasil login maka di arahkan ke tautan otorisasi.
|
|
Yup, selesai. Setelah saya perbaiki, ternyata hanya membutuhkan 6 langkah.
- Pengguna menuju ke halaman login moodle
moodle.tld/login
. - Pengguna mengklik tombol login
Testing OAuth
. - Pengguna diarahkan ke website OAuth2 untuk menuju ke halaman persetujuan. Namun, karena pengguna belum login ke website OAuth2 maka di arahkan ke halaman login oauth2
oauth2.tld/login?client_id=4&return_to=%2Foauth%2Fauthorize?abc
. - Setelah berhasil login ke website OAuth2, pengguna diarahkan halaman otorisasi untuk memberi konfirmasi ya atau tidak Moodle diijinkan untuk mendapatkan akses identitas milik kita dari OAuth2 server tadi.
- Pengguna mengklik tombol
Autorize
untuk memberikan ijin Moodle mendapatkan data identitas kita.

- Pengguna di arahkan ke halaman pengguna Moodle
moodle.tld/my
.
Saya mencari jawaban di issue Laravel Passport terkait Passport doesn’t redirect back to authorization form after login di issue nomor #248 dan #703. Namun, tidak ketemu jawabannya.
Tiba-tiba, saya teringat pernah mengimplementasikan login ke web PHPBali dengan Github OAuth2 menggunakan Socialite. Dengan bermodalkan inspect network, ketelitian dalam membaca url address bar, mengecek middleware yang menunggangi oauth/authorize
dan bermain fungsi dd()
yang disediakan oleh Laravel akhirnya permasalahan berhasil diselesaikan.