diff --git a/app/Http/Middleware/HandleInertiaRequests.php b/app/Http/Middleware/HandleInertiaRequests.php index 4c8a528..9e19df0 100644 --- a/app/Http/Middleware/HandleInertiaRequests.php +++ b/app/Http/Middleware/HandleInertiaRequests.php @@ -65,6 +65,8 @@ class HandleInertiaRequests extends Middleware }, $permissions); }, '$menus' => fn () => $request->user()?->menus(), + + '$token' => fn () => session('token'), ]); } } diff --git a/app/Listeners/CreateTemporaryToken.php b/app/Listeners/CreateTemporaryToken.php new file mode 100644 index 0000000..f340270 --- /dev/null +++ b/app/Listeners/CreateTemporaryToken.php @@ -0,0 +1,49 @@ +user; + + $temporaryToken = DB::table('temporary_tokens') + ->where('user_id', $user->id) + ->first(); + + if ($temporaryToken) { + DB::table('personal_access_tokens')->delete($temporaryToken->token_id); + } + + $token = $user->createToken(uniqid()); + + DB::table('temporary_tokens') + ->insert([ + 'user_id' => $user->id, + 'token_id' => $token->accessToken->id, + ]); + + session()->put('token', $token->plainTextToken); + } +} diff --git a/app/Listeners/DeleteTemporaryToken.php b/app/Listeners/DeleteTemporaryToken.php new file mode 100644 index 0000000..435429d --- /dev/null +++ b/app/Listeners/DeleteTemporaryToken.php @@ -0,0 +1,39 @@ +user; + + $temporaryToken = DB::table('temporary_tokens')->where('user_id', $user->id)->first(); + + if ($temporaryToken) { + DB::table('personal_access_tokens')->delete($temporaryToken->token_id); + } + + session()->remove('token'); + } +} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index e04ad6d..c5c7773 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -3,6 +3,7 @@ namespace App\Providers; use Illuminate\Auth\Events\Login; +use Illuminate\Auth\Events\Logout; use Illuminate\Auth\Events\Registered; use Illuminate\Auth\Listeners\SendEmailVerificationNotification; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; @@ -21,8 +22,13 @@ class EventServiceProvider extends ServiceProvider ], Login::class => [ + \App\Listeners\CreateTemporaryToken::class, \App\Listeners\SaveUserLoginIpBrowserAndPlatform::class, ], + + Logout::class => [ + \App\Listeners\DeleteTemporaryToken::class, + ], ]; /** diff --git a/database/migrations/2022_07_29_140107_create_temporary_tokens_table.php b/database/migrations/2022_07_29_140107_create_temporary_tokens_table.php new file mode 100644 index 0000000..751fa03 --- /dev/null +++ b/database/migrations/2022_07_29_140107_create_temporary_tokens_table.php @@ -0,0 +1,44 @@ +unsignedBigInteger('user_id') + ->unique(); + $table->unsignedBigInteger('token_id') + ->unique(); + $table->timestamps(); + + $table->foreign('user_id') + ->references('id') + ->on('users') + ->cascadeOnDelete(); + + $table->foreign('token_id') + ->references('id') + ->on('personal_access_tokens') + ->cascadeOnDelete(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('temporary_tokens'); + } +}; diff --git a/resources/js/app.js b/resources/js/app.js index 3a6b026..4b2e51d 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -9,9 +9,13 @@ import { ZiggyVue } from '../../vendor/tightenco/ziggy/dist/vue.m'; import Themes from './themes' import Swal from 'sweetalert2'; import { Inertia } from '@inertiajs/inertia'; +import axios from 'axios'; const appName = window.document.getElementsByTagName('title')[0]?.innerText || 'Laravel'; +const { $token } = JSON.parse(document.getElementById('app').dataset.page).props +axios.defaults.headers.common['Authorization'] = `Bearer ${$token}` + const can = (abilities) => { const { $permissions } = usePage().props.value @@ -64,6 +68,17 @@ const Toast = Swal.mixin({ } }) +const authorization = () => { + const { $token } = usePage().props.value + + if ($token) { + axios.defaults.headers.common['Authorization'] = `Bearer ${$token}` + } +} + +Inertia.on('start', authorization) +Inertia.on('finish', authorization) + window.Toast = Toast Inertia.on('finish', () => { diff --git a/routes/api.php b/routes/api.php index c646b0a..45ed68f 100644 --- a/routes/api.php +++ b/routes/api.php @@ -14,7 +14,7 @@ use Illuminate\Support\Facades\Route; | */ -Route::prefix('/v1')->name('api.v1.')->group(function () { +Route::prefix('/v1')->name('api.v1.')->middleware(['auth:sanctum'])->group(function () { Route::get('/user/{user}/menu', fn (App\Models\User $user) => $user->menus())->name('user.menu'); Route::name('superuser.')->group(function () { @@ -25,4 +25,6 @@ Route::prefix('/v1')->name('api.v1.')->group(function () { Route::post('/superuser/activity/login', [App\Http\Controllers\ActivityController::class, 'logins'])->name('activity.login'); Route::get('/superuser/menu', [App\Http\Controllers\Superuser\MenuController::class, 'get'])->name('menu'); }); + + Route::get('/user', fn () => request()->user()); }); \ No newline at end of file