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