From 76957c86b3033247414bbc7def767c20e2767093 Mon Sep 17 00:00:00 2001 From: jorplaz <429-jorplaz@users.noreply.gitlab.inf.uva.es> Date: Mon, 20 Jun 2022 14:53:50 +0200 Subject: [PATCH] Auth configured --- app/Exceptions/Handler.php | 20 +++++++++++- .../SactumAuthenticationException.php | 8 +++++ app/Http/Controllers/AuthController.php | 32 +++++++++++++++++++ app/Http/Middleware/Authenticate.php | 12 +++---- app/Models/User.php | 1 + app/Providers/AppServiceProvider.php | 3 +- composer.json | 2 +- composer.lock | 12 +++---- config/auth.php | 6 +++- config/sanctum.php | 2 +- routes/api.php | 13 ++++++++ 11 files changed, 92 insertions(+), 19 deletions(-) create mode 100644 app/Exceptions/SactumAuthenticationException.php create mode 100644 app/Http/Controllers/AuthController.php diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 82a37e4..594bedf 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -3,6 +3,10 @@ namespace App\Exceptions; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; +use Illuminate\Http\Response; +use Illuminate\Support\Facades\Log; use Throwable; class Handler extends ExceptionHandler @@ -44,7 +48,21 @@ class Handler extends ExceptionHandler public function register() { $this->reportable(function (Throwable $e) { - // + Log::error('exception: '.$e->getTraceAsString()); }); } + + /** + * @param Request $request + * @param Throwable $e + * @return Response|JsonResponse|\Symfony\Component\HttpFoundation\Response + * @throws Throwable + */ + public function render($request, Throwable $e): Response|JsonResponse|\Symfony\Component\HttpFoundation\Response + { + if ($e instanceof SactumAuthenticationException) { + return \response()->json('This process requires to be authenticated',401); + } + return parent::render($request, $e); + } } diff --git a/app/Exceptions/SactumAuthenticationException.php b/app/Exceptions/SactumAuthenticationException.php new file mode 100644 index 0000000..b0cb5d5 --- /dev/null +++ b/app/Exceptions/SactumAuthenticationException.php @@ -0,0 +1,8 @@ +<?php + +namespace App\Exceptions; + +use Exception; +use JetBrains\PhpStorm\Pure; + +class SactumAuthenticationException extends Exception{} diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php new file mode 100644 index 0000000..87a0349 --- /dev/null +++ b/app/Http/Controllers/AuthController.php @@ -0,0 +1,32 @@ +<?php + +namespace App\Http\Controllers; + +use Illuminate\Http\Request; +use Illuminate\Support\Facades\Validator; + +class AuthController extends Controller +{ + public function login(Request $request) + { + $validator = Validator::make($request->all(), [ + 'email' => 'required|string|email', + 'password' => 'required|string|min:6' + ]); + + if ( $validator->fails() || !auth('api')->attempt($validator->validated()) ) { + return response()->json(['Invalid credentials'], 401); + } + + return response()->json([ + 'token' => auth('api')->user()->createToken('API Token')->plainTextToken, + 'user' => auth('api')->user() + ]); + } + + public function logout() + { + auth()->user()->tokens()->delete(); + return response()->json(['Token revoked']); + } +} \ No newline at end of file diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index 704089a..d9dcc92 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -2,20 +2,16 @@ namespace App\Http\Middleware; +use App\Exceptions\SactumAuthenticationException; use Illuminate\Auth\Middleware\Authenticate as Middleware; class Authenticate extends Middleware { /** - * Get the path the user should be redirected to when they are not authenticated. - * - * @param \Illuminate\Http\Request $request - * @return string|null + * @throws SactumAuthenticationException */ - protected function redirectTo($request) + protected function unauthenticated($request, array $guards) { - if (! $request->expectsJson()) { - return route('login'); - } + throw new SactumAuthenticationException("To access this endpoint you need to be authenticated",401); } } diff --git a/app/Models/User.php b/app/Models/User.php index aea9982..b9cb8ba 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -12,6 +12,7 @@ use Laravel\Sanctum\HasApiTokens; /** * @method static create(string[] $array) + * @method static find(int $id) */ class User extends Authenticatable { diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index ee8ca5b..88da5b6 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,6 +2,7 @@ namespace App\Providers; +use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider @@ -23,6 +24,6 @@ class AppServiceProvider extends ServiceProvider */ public function boot() { - // + JsonResource::withoutWrapping(); } } diff --git a/composer.json b/composer.json index 164c94b..0ab4cf7 100644 --- a/composer.json +++ b/composer.json @@ -8,7 +8,7 @@ "php": "^8.0.2", "guzzlehttp/guzzle": "^7.2", "laravel/framework": "^9.11", - "laravel/sanctum": "^2.14.1", + "laravel/sanctum": "^2.15", "laravel/tinker": "^2.7" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 5d01821..292c550 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1abc7822bd9f28e9a62986817bf04f76", + "content-hash": "58fa573d0eb02b0bca9c8679dea764c0", "packages": [ { "name": "brick/math", @@ -895,16 +895,16 @@ }, { "name": "laravel/framework", - "version": "v9.13.0", + "version": "v9.17.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "87b6cc8bc41d1cf85c7c1401cddde8570a3b95bb" + "reference": "091e287678ac723c591509ca6374e4ded4a99b1c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/87b6cc8bc41d1cf85c7c1401cddde8570a3b95bb", - "reference": "87b6cc8bc41d1cf85c7c1401cddde8570a3b95bb", + "url": "https://api.github.com/repos/laravel/framework/zipball/091e287678ac723c591509ca6374e4ded4a99b1c", + "reference": "091e287678ac723c591509ca6374e4ded4a99b1c", "shasum": "" }, "require": { @@ -1070,7 +1070,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2022-05-17T14:07:43+00:00" + "time": "2022-06-07T15:09:32+00:00" }, { "name": "laravel/sanctum", diff --git a/config/auth.php b/config/auth.php index d8c6cee..d819ad6 100644 --- a/config/auth.php +++ b/config/auth.php @@ -14,7 +14,7 @@ return [ */ 'defaults' => [ - 'guard' => 'web', + 'guard' => 'api', 'passwords' => 'users', ], @@ -40,6 +40,10 @@ return [ 'driver' => 'session', 'provider' => 'users', ], + 'api' => [ + 'driver' => 'session', + 'provider' => 'users', + ], ], /* diff --git a/config/sanctum.php b/config/sanctum.php index 529cfdc..0b60dde 100644 --- a/config/sanctum.php +++ b/config/sanctum.php @@ -33,7 +33,7 @@ return [ | */ - 'guard' => ['web'], + 'guard' => ['api'], /* |-------------------------------------------------------------------------- diff --git a/routes/api.php b/routes/api.php index eb6fa48..fd621db 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,5 +1,9 @@ <?php +use App\Http\Controllers\AuthController; +use App\Http\Controllers\BikeController; +use App\Http\Controllers\RouteController; +use App\Http\Controllers\StopController; use Illuminate\Http\Request; use Illuminate\Support\Facades\Route; @@ -17,3 +21,12 @@ use Illuminate\Support\Facades\Route; Route::middleware('auth:sanctum')->get('/user', function (Request $request) { return $request->user(); }); + +Route::post('/login', [AuthController::class, 'login']); +Route::get('/retobici/stops', [StopController::class, 'getAllStops']); + +Route::middleware('auth:sanctum')->group(function (){ + Route::post('/retobici/bikes/unlock/{bike}', [BikeController::class, 'unlockBike']); + Route::put('/retobici/routes', [RouteController::class, 'createRoute']); +}); + -- GitLab