OAuth 2.0 adalah standar industri untuk delegasi akses. Artinya, dengan OAuth 2.0, aplikasi Anda dapat mengakses sumber daya (seperti data pengguna) dari aplikasi lain (seperti Google, Facebook, atau aplikasi Laravel lainnya) atas nama pengguna, tanpa pengguna harus memberikan kata sandi mereka langsung ke aplikasi Anda. Di Laravel, Laravel Passport menyediakan implementasi lengkap OAuth 2.0 untuk mengamankan API Anda dengan mudah. Artikel ini akan memandu Anda langkah demi langkah tentang menggunakan Laravel Passport untuk OAuth 2.0 Authentication.
Apa Itu OAuth 2.0 dan Mengapa Menggunakan Laravel Passport?
Sebelum kita menyelami kode, mari kita pahami dulu apa itu OAuth 2.0 dan mengapa Laravel Passport adalah pilihan yang tepat untuk implementasinya.
OAuth 2.0 (Otorisasi Terbuka) adalah kerangka kerja otorisasi yang memungkinkan aplikasi pihak ketiga untuk mendapatkan akses terbatas ke layanan HTTP atas nama pemilik sumber daya, dengan menyetujui interaksi otorisasi antara pemilik sumber daya dan layanan HTTP atau dengan mengizinkan aplikasi pihak ketiga untuk mendapatkan akses atas namanya sendiri. Sederhananya, OAuth 2.0 memberikan cara yang aman dan terstandarisasi untuk berbagi akses ke sumber daya tanpa harus mengungkap kredensial pengguna.
Mengapa Laravel Passport?
- Sederhana dan Mudah Diintegrasikan: Laravel Passport menyederhanakan implementasi OAuth 2.0 di aplikasi Laravel Anda. Ini menyediakan serangkaian alat dan helper yang memudahkan proses setup dan konfigurasi.
- Keamanan: Passport menangani banyak kompleksitas protokol OAuth 2.0, termasuk enkripsi dan penyimpanan token yang aman.
- Fleksibel: Passport mendukung berbagai jenis grant OAuth 2.0, memungkinkan Anda untuk menyesuaikan proses otorisasi sesuai dengan kebutuhan aplikasi Anda.
- Didukung Laravel: Sebagai paket resmi Laravel, Passport terintegrasi dengan baik dengan fitur-fitur Laravel lainnya, seperti middleware dan authorization policies.
Langkah-langkah Instalasi dan Konfigurasi Laravel Passport
Sekarang kita memiliki pemahaman dasar tentang OAuth 2.0 dan Laravel Passport, mari kita mulai dengan proses instalasi dan konfigurasi.
-
Instalasi Passport melalui Composer:
Buka terminal atau command prompt Anda dan arahkan ke direktori proyek Laravel Anda. Kemudian, jalankan perintah berikut untuk menginstal Passport menggunakan Composer:
composer require laravel/passport
-
Migrasi Database:
Passport memerlukan beberapa tabel database untuk menyimpan clients, tokens, dan scopes. Jalankan perintah migrasi Artisan berikut untuk membuat tabel-tabel ini:
php artisan migrate
-
Install Passport:
Perintah
passport:install
akan menghasilkan kunci enkripsi yang diperlukan oleh Passport untuk membuat access tokens yang aman. Perintah ini juga akan membuat clients “personal access” dan “password grant”. Jalankan perintah berikut:php artisan passport:install
Setelah berhasil, Anda akan melihat output yang menunjukkan client ID dan client secret untuk kedua clients tersebut. Simpan informasi ini untuk penggunaan selanjutnya, meskipun Anda mungkin tidak memerlukannya secara langsung dalam banyak kasus.
-
Konfigurasi
AppModelsUser
:Di model
AppModelsUser
Anda (atau model yang mewakili pengguna Anda), gunakan traitLaravelPassportHasApiTokens
. Trait ini menyediakan beberapa metode helper yang digunakan untuk bekerja dengan Passport.<?php namespace AppModels; // use IlluminateContractsAuthMustVerifyEmail; // Removed use IlluminateDatabaseEloquentFactoriesHasFactory; use IlluminateFoundationAuthUser as Authenticatable; use IlluminateNotificationsNotifiable; use LaravelPassportHasApiTokens; // Added use LaravelSanctumHasApiTokens as SanctumHasApiTokens; // Keep this if you are using Sanctum too class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable, SanctumHasApiTokens; // ... (the rest of your User model) }
-
Konfigurasi
config/auth.php
:Konfigurasi
auth.php
menentukan guard dan provider otentikasi default. Pastikan guardapi
menggunakan providerusers
. Biasanya ini sudah dikonfigurasi secara default:'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'passport', // Make sure this is 'passport' 'provider' => 'users', ], ],
-
Konfigurasi
RouteServiceProvider
(Penting untuk API):
Di file app/Providers/RouteServiceProvider.php
, pada method boot
, tambahkan baris berikut untuk menggunakan middleware SubstituteBindings
pada routes api
. Ini memastikan bahwa parameter route yang menggunakan model binding akan diresolusi dengan benar. Ini sangat penting untuk Passport.
public function boot(): void
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
});
$this->routes(function () {
Route::middleware('api')
->prefix('api')
->group(base_path('routes/api.php'));
Route::middleware('web')
->group(base_path('routes/web.php'));
});
// Add this line! Essential for model binding in API routes using Passport
Route::model('user', AppModelsUser::class); // Example - replace User with your model if needed
}
-
Menambahkan Passport ke
api.php
:Passport menyediakan rute yang diperlukan untuk otentikasi OAuth 2.0, seperti permintaan token. Tambahkan baris berikut ke file
routes/api.php
Anda:<?php use IlluminateHttpRequest; use IlluminateSupportFacadesRoute; /* |-------------------------------------------------------------------------- | API Routes |-------------------------------------------------------------------------- | | Here is where you can register API routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | is assigned the "api" middleware group. Enjoy building your API! | */ Route::middleware('auth:api')->get('/user', function (Request $request) { return $request->user(); }); // Add this line! Route::middleware('api')->group(function () { Passport::routes(); });
PENTING: Pastikan Anda telah mengimpor class
LaravelPassportPassport
di bagian atas fileapi.php
Anda:use LaravelPassportPassport;
Setelah menyelesaikan langkah-langkah ini, Laravel Passport seharusnya sudah terinstal dan terkonfigurasi dengan benar di aplikasi Laravel Anda.
Membuat dan Mengelola OAuth 2.0 Clients
OAuth 2.0 clients adalah representasi aplikasi pihak ketiga yang ingin mengakses API Anda. Passport memungkinkan Anda untuk membuat dan mengelola clients ini melalui antarmuka command-line.
Membuat Client:
Anda dapat membuat client baru menggunakan perintah passport:client
. Perintah ini akan meminta Anda untuk memberikan nama untuk client dan URL redirect (URL tempat pengguna akan dialihkan setelah memberikan otorisasi).
php artisan passport:client
Pilih opsi yang sesuai dengan kebutuhan Anda (misalnya, Personal Access Client jika Anda ingin membuat token untuk aplikasi Anda sendiri, atau Password Grant Client jika Anda ingin mengizinkan pengguna untuk masuk langsung melalui API).
Setelah pembuatan, Anda akan mendapatkan client ID dan client secret. Simpan informasi ini dengan aman, karena akan diperlukan oleh aplikasi pihak ketiga untuk mengakses API Anda.
Mengelola Clients:
Anda dapat melihat daftar semua clients yang terdaftar menggunakan perintah passport:client --list
. Untuk mencabut atau memperbarui client, Anda dapat mengaksesnya langsung melalui tabel database oauth_clients
.
Mendefinisikan Scopes untuk Membatasi Akses
Scopes memungkinkan Anda untuk menentukan tingkat akses yang diberikan kepada aplikasi pihak ketiga. Misalnya, Anda dapat membuat scope untuk membaca data pengguna, scope untuk memperbarui data pengguna, dan seterusnya. Dengan menggunakan scopes, Anda dapat memberikan kontrol yang lebih terperinci atas akses ke API Anda.
Mendefinisikan Scopes:
Passport memungkinkan Anda untuk mendefinisikan scopes dalam file konfigurasi config/auth.php
. Tambahkan array scopes
ke array guards['api']
. Setiap scope memiliki ID dan deskripsi.
'guards' => [
'api' => [
'driver' => 'passport',
'provider' => 'users',
'scopes' => [
'read-profile' => 'Baca informasi profil Anda',
'update-profile' => 'Perbarui informasi profil Anda',
'create-post' => 'Membuat postingan baru',
'delete-post' => 'Menghapus postingan'
],
],
],
Menggunakan Scopes:
Saat memberikan otorisasi kepada client, Anda dapat menentukan scopes mana yang ingin Anda berikan. Ini dapat dilakukan melalui antarmuka Passport atau melalui API.
Mendapatkan Access Tokens: Berbagai Jenis Grant
Passport mendukung berbagai jenis grant OAuth 2.0, yang memungkinkan Anda untuk menyesuaikan proses otorisasi sesuai dengan kebutuhan aplikasi Anda. Beberapa jenis grant yang paling umum meliputi:
- Authorization Code Grant: Jenis grant ini adalah yang paling aman dan direkomendasikan untuk aplikasi web. Alurnya melibatkan pengalihan pengguna ke server otorisasi, di mana mereka memberikan otorisasi. Setelah memberikan otorisasi, pengguna dialihkan kembali ke aplikasi dengan kode otorisasi, yang kemudian ditukarkan dengan access token.
- Password Grant: Jenis grant ini mengizinkan aplikasi untuk meminta access token langsung dari server otorisasi menggunakan nama pengguna dan kata sandi. Jenis grant ini hanya boleh digunakan jika Anda mempercayai aplikasi sepenuhnya (misalnya, aplikasi native yang Anda kembangkan sendiri).
- Client Credentials Grant: Jenis grant ini mengizinkan aplikasi untuk meminta access token atas namanya sendiri, tanpa keterlibatan pengguna. Ini berguna untuk aplikasi yang perlu mengakses sumber daya tanpa representasi pengguna.
- Implicit Grant: Tidak direkomendasikan dan di-deprecate. Jenis grant ini langsung mengembalikan access token ke client melalui URL redirect. Rentan terhadap serangan, sehingga sebaiknya dihindari.
- Personal Access Tokens: Passport menyediakan mekanisme sederhana untuk membuat access token untuk aplikasi Anda sendiri. Ini berguna untuk pengujian atau untuk mengakses API Anda dari aplikasi command-line.
Contoh Penggunaan Password Grant (Untuk Aplikasi yang Terpercaya):
use IlluminateSupportFacadesHttp;
$response = Http::post('http://your-app.com/oauth/token', [
'grant_type' => 'password',
'client_id' => 'YOUR_CLIENT_ID',
'client_secret' => 'YOUR_CLIENT_SECRET',
'username' => 'your_username',
'password' => 'your_password',
'scope' => '*', // atau daftar scopes yang diperlukan
]);
$accessToken = $response->json()['access_token'];
Contoh Penggunaan Client Credentials Grant (Untuk Aplikasi Server-to-Server):
use IlluminateSupportFacadesHttp;
$response = Http::post('http://your-app.com/oauth/token', [
'grant_type' => 'client_credentials',
'client_id' => 'YOUR_CLIENT_ID',
'client_secret' => 'YOUR_CLIENT_SECRET',
]);
$accessToken = $response->json()['access_token'];
Pastikan untuk mengganti YOUR_CLIENT_ID
dan YOUR_CLIENT_SECRET
dengan nilai yang sesuai. Ingatlah bahwa penggunaan password grant sebaiknya dibatasi untuk kasus di mana Anda memiliki kontrol penuh atas aplikasi yang meminta token.
Mengamankan API Anda dengan Middleware Passport
Setelah Anda memiliki access token, Anda dapat menggunakannya untuk mengakses API Anda. Passport menyediakan middleware auth:api
yang dapat Anda gunakan untuk melindungi rute API Anda.
Menerapkan Middleware:
Untuk melindungi rute API, tambahkan middleware auth:api
ke definisi rute Anda.
Route::middleware('auth:api')->get('/users', function () {
// Hanya pengguna yang terotentikasi dengan access token yang valid yang dapat mengakses ini
return AppModelsUser::all();
});
Ketika rute ini diakses, Passport akan memverifikasi access token yang disediakan dalam header Authorization
(dengan skema Bearer
). Jika token valid dan pengguna memiliki scopes yang diperlukan, permintaan akan diizinkan. Jika tidak, permintaan akan ditolak dengan kode status HTTP 401 Unauthorized
.
Contoh Penggunaan Scopes dalam Middleware:
Anda dapat membatasi akses ke rute berdasarkan scopes yang diberikan kepada access token menggunakan middleware scopes
.
Route::middleware(['auth:api', 'scopes:read-profile,update-profile'])->get('/profile', function () {
// Hanya pengguna yang memiliki scope 'read-profile' dan 'update-profile' yang dapat mengakses ini
return auth()->user();
});
Kustomisasi Laravel Passport: Lebih dari Sekadar Standar
Laravel Passport sangat fleksibel dan memungkinkan Anda untuk menyesuaikan berbagai aspek implementasi OAuth 2.0 Anda.
Menyesuaikan Token Lifetimes:
Anda dapat mengkonfigurasi berapa lama access tokens dan refresh tokens berlaku. Hal ini dilakukan melalui file config/passport.php
.
'tokens' => [
'access_token_lifetime' => DateInterval::createFromDateString('1 hour'), // Default: 1 year
'refresh_token_lifetime' => DateInterval::createFromDateString('2 weeks'), // Default: 2 weeks
],
Menyesuaikan Model:
Anda dapat menyesuaikan model yang digunakan oleh Passport untuk menyimpan clients, tokens, dan scopes. Untuk melakukan ini, Anda perlu membuat model Anda sendiri yang memperluas model Passport yang sesuai dan kemudian mengkonfigurasi Passport untuk menggunakan model Anda di file config/passport.php
.
Menyesuaikan Storage Drivers:
Secara default, Passport menggunakan database untuk menyimpan clients, tokens, dan scopes. Anda dapat mengkonfigurasi Passport untuk menggunakan storage drivers lain, seperti Redis, untuk meningkatkan performa.
Menguji Implementasi Laravel Passport Anda
Setelah Anda mengimplementasikan Laravel Passport, penting untuk mengujinya secara menyeluruh untuk memastikan bahwa semuanya berfungsi dengan benar.
Menggunakan Tools Seperti Postman atau Insomnia:
Tool seperti Postman atau Insomnia sangat berguna untuk menguji API Anda. Anda dapat menggunakan tool ini untuk membuat permintaan ke rute API Anda dan memverifikasi bahwa otentikasi dan otorisasi berfungsi seperti yang diharapkan.
Membuat Unit Tests:
Membuat unit tests adalah cara yang bagus untuk mengotomatiskan pengujian implementasi Passport Anda. Anda dapat menggunakan unit tests untuk memverifikasi bahwa access tokens dibuat dengan benar, bahwa middleware auth:api
melindungi rute API Anda, dan bahwa scopes berfungsi seperti yang diharapkan.
Troubleshooting Masalah Umum dengan Laravel Passport
Meskipun Laravel Passport dirancang untuk menjadi mudah digunakan, Anda mungkin mengalami beberapa masalah selama proses implementasi. Berikut adalah beberapa masalah umum dan solusinya:
- “Class ‘LaravelPassportPassport’ not found”: Pastikan Anda telah menginstal Passport menggunakan Composer dan telah mengimpor class
LaravelPassportPassport
di fileroutes/api.php
Anda. - “Unauthenticated.”: Pastikan Anda mengirimkan access token yang valid dalam header
Authorization
dengan skemaBearer
. Periksa juga apakah access token belum kedaluwarsa. - “Insufficient scope.”: Pastikan access token yang Anda gunakan memiliki scopes yang diperlukan untuk mengakses rute yang Anda coba akses.
- “The Mix manifest does not exist.”: Masalah ini biasanya terjadi jika Anda belum menjalankan perintah
npm run dev
ataunpm run prod
untuk mengkompilasi assets aplikasi Anda. Meskipun masalah ini tidak langsung terkait dengan Passport, hal ini dapat menyebabkan masalah dengan antarmuka pengguna Passport jika Anda menggunakan antarmuka bawaan.
Kesimpulan: Keamanan dan Fleksibilitas dengan Laravel Passport
Laravel Passport adalah solusi yang ampuh dan fleksibel untuk mengimplementasikan OAuth 2.0 di aplikasi Laravel Anda. Dengan Passport, Anda dapat dengan mudah mengamankan API Anda dan memberikan kontrol yang terperinci atas akses ke sumber daya Anda. Dengan memahami konsep dasar OAuth 2.0 dan mengikuti langkah-langkah yang diuraikan dalam artikel ini, Anda dapat dengan mudah mengintegrasikan Passport ke dalam aplikasi Anda dan mendapatkan manfaat dari keamanan dan fleksibilitas yang ditawarkannya. Dengan menguasai Laravel: Menggunakan Laravel Passport untuk OAuth 2.0 Authentication, Anda akan membangun fondasi yang kuat untuk mengamankan dan mengembangkan aplikasi Laravel Anda lebih lanjut. Ingatlah untuk selalu menguji implementasi Anda secara menyeluruh dan untuk mengikuti praktik terbaik untuk keamanan aplikasi web.