From 43cd6f35be8734c72152ea4ee950039e6d29496e Mon Sep 17 00:00:00 2001 From: Dillon Date: Thu, 6 Apr 2023 22:57:50 +0800 Subject: [PATCH] New route, middleware, token table, filters for query to allow third party to access api --- .../General/Eloquent/Filters/AmountExceed.php | 19 +++++++ .../General/Eloquent/Filters/AmountShort.php | 19 +++++++ .../Eloquent/Filters/CreatedBefore.php | 20 +++++++ .../Eloquent/Filters/PaymentMethod.php | 20 +++++++ app/Http/Kernel.php | 8 ++- .../Middleware/TokenCheckerMiddleware.php | 56 +++++++++++++++++++ app/Models/PersonalAccessTokens.php | 9 +++ app/Providers/RouteServiceProvider.php | 5 ++ ...01_create_personal_access_tokens_table.php | 36 ++++++++++++ routes/apipub.php | 9 +++ 10 files changed, 200 insertions(+), 1 deletion(-) create mode 100644 app/Classes/General/Eloquent/Filters/AmountExceed.php create mode 100644 app/Classes/General/Eloquent/Filters/AmountShort.php create mode 100644 app/Classes/General/Eloquent/Filters/CreatedBefore.php create mode 100644 app/Classes/General/Eloquent/Filters/PaymentMethod.php create mode 100644 app/Http/Middleware/TokenCheckerMiddleware.php create mode 100644 app/Models/PersonalAccessTokens.php create mode 100644 database/migrations/2023_04_06_000001_create_personal_access_tokens_table.php create mode 100644 routes/apipub.php diff --git a/app/Classes/General/Eloquent/Filters/AmountExceed.php b/app/Classes/General/Eloquent/Filters/AmountExceed.php new file mode 100644 index 00000000..a3e353fa --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/AmountExceed.php @@ -0,0 +1,19 @@ +where('amount', '>', $value); + } +} diff --git a/app/Classes/General/Eloquent/Filters/AmountShort.php b/app/Classes/General/Eloquent/Filters/AmountShort.php new file mode 100644 index 00000000..7406fc47 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/AmountShort.php @@ -0,0 +1,19 @@ +where('amount', '<', $value); + } +} diff --git a/app/Classes/General/Eloquent/Filters/CreatedBefore.php b/app/Classes/General/Eloquent/Filters/CreatedBefore.php new file mode 100644 index 00000000..bbbe3232 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/CreatedBefore.php @@ -0,0 +1,20 @@ +where('created_at', '<', Carbon::parse($value)); + } +} diff --git a/app/Classes/General/Eloquent/Filters/PaymentMethod.php b/app/Classes/General/Eloquent/Filters/PaymentMethod.php new file mode 100644 index 00000000..cd8ba435 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/PaymentMethod.php @@ -0,0 +1,20 @@ +where('payment_method', $value); + } + +} diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 79e670f6..dc3bc265 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -44,6 +44,11 @@ class Kernel extends HttpKernel 'throttle:300,1', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], + + 'apipub' => [ + // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], ]; /** @@ -63,6 +68,7 @@ class Kernel extends HttpKernel 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, - 'valid.token' => ValidateToken::class + 'valid.token' => ValidateToken::class, + 'token.check' => \App\Http\Middleware\TokenCheckerMiddleware::class, ]; } diff --git a/app/Http/Middleware/TokenCheckerMiddleware.php b/app/Http/Middleware/TokenCheckerMiddleware.php new file mode 100644 index 00000000..480ea348 --- /dev/null +++ b/app/Http/Middleware/TokenCheckerMiddleware.php @@ -0,0 +1,56 @@ +query('api-key')) { + return response()->json(['message' => 'Invalid API key.'], 401); + } + + // Check if the api_key is valid + $apiKey = $request->query('api-key'); + $personalAccessToken = PersonalAccessTokens::where('token', $apiKey)->first(); + + if (!$personalAccessToken) { + return response()->json(['error' => 'Unauthorized'], 401); + } + return $next($request); + + //Method 2: Token pass via request header + /* + $authHeader = $request->header('Authorization'); + if (preg_match('/Bearer\s+(.*)$/i', $authHeader, $matches)) { + $token = $matches[1]; + // validate the token here + + $personalAccessToken = PersonalAccessToken::where('token', $token)->first(); + + if (!$personalAccessToken) { + return response()->json(['error' => 'Unauthorized'], 401); + } + + + // if the token is valid, you can attach it to the request + $request->attributes->add(['bearerToken' => $token]); + return $next($request); + } + return response()->json(['error' => 'Unauthorized'], 401); + */ + } +} diff --git a/app/Models/PersonalAccessTokens.php b/app/Models/PersonalAccessTokens.php new file mode 100644 index 00000000..5efc331d --- /dev/null +++ b/app/Models/PersonalAccessTokens.php @@ -0,0 +1,9 @@ +namespace($this->namespace) ->group(base_path('routes/api.php')); + Route::prefix('public/api') + ->middleware('apipub') + ->namespace($this->namespace) + ->group(base_path('routes/apipub.php')); + Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/web.php')); diff --git a/database/migrations/2023_04_06_000001_create_personal_access_tokens_table.php b/database/migrations/2023_04_06_000001_create_personal_access_tokens_table.php new file mode 100644 index 00000000..691a4bf8 --- /dev/null +++ b/database/migrations/2023_04_06_000001_create_personal_access_tokens_table.php @@ -0,0 +1,36 @@ +bigIncrements('id'); + // $table->morphs('tokenable'); + $table->string('name'); + $table->string('token', 64)->unique(); + $table->text('abilities')->nullable(); + $table->timestamp('last_used_at')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('personal_access_tokens'); + } +} diff --git a/routes/apipub.php b/routes/apipub.php new file mode 100644 index 00000000..7ad05b14 --- /dev/null +++ b/routes/apipub.php @@ -0,0 +1,9 @@ + 'apipub', 'prefix' => 'v1', 'as' => 'apipub.'], function () { + Route::group(['middleware' => 'token.check'], function () { + Route::get('/list', 'Transactions\ListTransactionsController@list')->name('list'); + }); +});