diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 82a37e400815ec871d3b88cc2f08a67740cec161..594bedfb51d2e9d594418b85e9e645d2f28ec6e1 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 0000000000000000000000000000000000000000..b0cb5d5a876925be6112748caf847ce26efdbd31 --- /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 0000000000000000000000000000000000000000..87a034926769f706a54507604e114bbe72737b09 --- /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 704089a7fe757c137d99241b758c912d8391e19d..d9dcc9249a79dff706971403f1b2bad205fbe237 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 aea9982747212ebf54344dcd3e3e63624f17e195..b9cb8bad4182d986e72afc66e46588fb667c32c9 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 ee8ca5bcd8f77d219f29529a9163587235c545d5..88da5b60052b9951ea3f8090e56d088e2f91b4ad 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 164c94bdd7dbe07d31942c7d1279e91f8aba9ab0..0ab4cf735fc13671e559a298985978b4c2dcf0e4 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 5d01821b24868d1bc3e6d01977af95e0f33629e5..292c550f7374c6998d1a77fcf13efcc3b5fd0045 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 d8c6cee7c19c410449b5b9458bde053ae8f5bda0..d819ad65137efa3a6057771685e0dc020d8bbc19 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 529cfdc9916c1bd990016e2d8789895873908548..0b60dde1bc0f352744b4810d086b1c32cfc61b5f 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 eb6fa48c25d93f7bf753ba612cd2c7efecea5f4b..fd621dbcf9e902b16e206e12d41295cb02eb7882 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']); +}); +