Halo para seniman
yang budiman! Kita kembali pada bagian kedua dari seri artikel tentang integrasi autentikasi sosial menggunakan Laravel Socialite dan berbagi sesi antar aplikasi Laravel dengan token JWT. Pada bagian sebelumnya, kita telah membahas implementasi pada aplikasi account.example.test
. Sekarang, kita akan mengarahkan perhatian kita pada aplikasi kedua, yaitu app.example.test
. Mari kita lanjutkan dengan langkah-langkah yang perlu dilakukan untuk mengintegrasikan autentikasi sosial dan berbagi sesi di aplikasi ini.
Membuat middleware untuk check token #
Jalan perintah dibawah ini untuk membuat middleware
php artisan make:middleware
Mendaftarkan middleware di laravel 11 bootstrap\app.php
, jika menggunakan versi dibawahnya dilahkan masukan di sini app/Http/Kernel.php
// Laravel 11
->withMiddleware(function (Middleware $middleware) {
$middleware->alias([
'auth' => App\Http\Middleware\CheckAutoLogin::class,
]);
})
// Laravel 10
protected $middlewareAliases = [
'auth' => App\Http\Middleware\CheckAutoLogin::class,
]
// Laravel 7+
protected $routeMiddleware = [
'auth' => App\Http\Middleware\CheckAutoLogin::class,
]
Setelah mendaftarakan middleware nya silahkan buka file yang sudah di buat App\Http\Middleware\CheckAutoLogin.php
dan ubah kodenya menjadi seperti berikut:
$token = Cookie::get('nama-token-jwt');
if ($token) {
try {
// Decode token JWT
$decoded = JWT::decode($token, new Key('secret-your-key', 'HS256'));
$userId = $decoded->sub;
// Cari pengguna berdasarkan ID
$user = User::find($userId);
if ($user) {
Auth::login($user);
} else {
dd("Pengguna tidak ditemukan atau aksi tambahan lainnya");
}
} catch (\Exception $e) {
dd("Gagal Login ".$token);
}
} else {
return redirect()->to('https://account.example.test/login');
}
return $next($request);
Selanjutnya buat route di routes/web.php
dengan methode get
Route::get('/oauth', function () {
return view('dashboard');
})->middleware(CheckAutoLogin::class);
// -- OR --
Route::get('/dashboard', function () {
return view('dashboard');
})->middleware('auth');
// -- OR --
Route::middleware(['auth'])->group(function () {
Route::get('dashboard', function () {
return view('dashboard');
});
});
// Opsional
// Route untuk cek cookie atau gunakan `inspect` or `inspect element` di browser
Route::get('/get-cookie', function () {
return Cookie::get('nama-token-jwt');
});
Jika sekarang anda mencoba untuk mengakses get-cookies ini tidak akan berhasil sebab connection DB belum di setting untuk bisa saling berbagi session. maka dari itu kita akan menambahkan database ke dua untuk berbagi session dari aplikasi satu ke yang lainnya.
Tambah database connection #
'common_database' => [
'driver' => 'mysql',
'url' => env('COMMON_DB_URL'),
'host' => env('COMMON_DB_HOST', '127.0.0.1'),
'port' => env('COMMON_DB_PORT', '3306'),
'database' => env('COMMON_DB_DATABASE', 'laravel'),
'username' => env('COMMON_DB_USERNAME', 'root'),
'password' => env('COMMON_DB_PASSWORD', ''),
'unix_socket' => env('COMMON_DB_SOCKET', ''),
'charset' => env('COMMON_DB_CHARSET', 'utf8mb4'),
'collation' => env('COMMON_DB_COLLATION', 'utf8mb4_unicode_ci'),
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
Setelah menambahkan configurasi database selanjut nya tambahkan connection ke table user.php karena kita ingin aplikasi akan mengkonsumsi user pada aplikasi account.example.test
.
// Models/User.php
protected $connection = 'common_database';
Setting connection database di .env
untuk mencoba menghubungkan pada database aplikasi account.example.php
COMMON_DB_CONNECTION=mysql
COMMON_DB_HOST=127.0.0.1
COMMON_DB_PORT=3306
COMMON_DB_DATABASE=laravel_pos
COMMON_DB_USERNAME=root
COMMON_DB_PASSWORD=
SESSION_DRIVER=database
SESSION_DOMAIN=".example.test"