create temporary token for api authorization

This commit is contained in:
Geriano
2022-07-29 21:49:43 +07:00
parent 09717c078d
commit cda5225090
7 changed files with 158 additions and 1 deletions

View File

@@ -65,6 +65,8 @@ class HandleInertiaRequests extends Middleware
}, $permissions);
},
'$menus' => fn () => $request->user()?->menus(),
'$token' => fn () => session('token'),
]);
}
}

View File

@@ -0,0 +1,49 @@
<?php
namespace App\Listeners;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\DB;
class CreateTemporaryToken
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param object $event
* @return void
*/
public function handle($event)
{
$user = $event->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);
}
}

View File

@@ -0,0 +1,39 @@
<?php
namespace App\Listeners;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\DB;
class DeleteTemporaryToken
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param object $event
* @return void
*/
public function handle($event)
{
$user = $event->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');
}
}

View File

@@ -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,
],
];
/**

View File

@@ -0,0 +1,44 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('temporary_tokens', function (Blueprint $table) {
$table->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');
}
};

View File

@@ -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', () => {

View File

@@ -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());
});