Laravel 6 Full 10

Seguridad

En este capítulo vamos a dotar de cierta seguridad a nuestra API para evitar en la medida de lo posible que los datos puedan ser manipulados.

Por defecto, Laravel viene con una sencilla solución para autenticación de API mediante tokens aleatorios asignados a cada usuario de tu aplicación. En tu archivo de configuración config/auth.php, un guard api ya está definido y utiliza un driver token. Este driver es responsable de inspeccionar el token de la API en la petición entrante y verificar que coincida con el token asignado al usuario en la base de datos.

Nota: Aunque Laravel viene con un sencillo guard de autenticación basado en token, te recomendamos considerar usar Laravel Passport para aplicaciones robustas en producción que ofrecen autenticación de API que es el que voy a usar.

Instalo passport a través del administrador de paquetes Composer:

composer require laravel/passport

A continuación voy a migrar las tablas para la base de datos, para pruebas he creado las tablas manualmente, ahora usaré el comando (he creado un proyecto nuevo desde cero):

php artisan migrate

Las tablas ya deberían estar creadas en nuestra base de datos y queda instalar passport:

php artisan passport:install

Configuración de passport:

En este paso, tenemos que configurar el modelo, el proveedor de servicios y el archivo de configuración de autenticación.

En el modelo agregamos la clase de pasaporte HasApiTokens,

En AuthServiceProvider agregamos «Passport :: routes ()»,

En auth.php, agregamos la configuración de autenticación de API.

app/User.php

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Laravel\Passport\HasApiTokens;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements MustVerifyEmail
{
    use HasApiTokens, Notifiable;
 
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */

    protected $fillable = [

        'name', 'email', 'password',

    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */

    protected $hidden = [

        'password', 'remember_token',

    ];
}

app/Providers/AuthServiceProvider.php

<?php

namespace App\Providers;

use Laravel\Passport\Passport;
use Illuminate\Support\Facades\Gate;

use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider

{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */

    protected $policies = [

        'App\Model' => 'App\Policies\ModelPolicy',

    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */

    public function boot()
    {

        $this->registerPolicies();

    }
}

config/auth.php

<?php

return [
    .....
    'guards' => [

        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
        ],
    ],
    .....
]

Una vez modificados los archivos realizaré pruebas para ver que todo funciona correctamente.

Añado las siguientes rutas, para el logín y registro:

rutas / api.php

Route::post('register', 'API\RegisterController@register');

Route::post('login', 'API\RegisterController@login');

Crear los archivos del controlador:

app/Http/Controllers/API/BaseController.php

<?php

namespace App\Http\Controllers\API;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller as Controller;

class BaseController extends Controller
{
    /**
     * success response method.
     *
     * @return \Illuminate\Http\Response
     */

    public function sendResponse($result, $message)
    {
    	$response = [
            'success' => true,
            'data'    => $result,
            'message' => $message,
        ];

        return response()->json($response, 200);
    }


    /**
     * return error response.
     *
     * @return \Illuminate\Http\Response
     */

    public function sendError($error, $errorMessages = [], $code = 404)
    {
    	$response = [
            'success' => false,
            'message' => $error,
        ];

        if(!empty($errorMessages)){
            $response['data'] = $errorMessages;
        }

        return response()->json($response, $code);
    }
}

app/Http/Controllers/API/RegisterController.php

<?php

namespace App\Http\Controllers\API;

use Illuminate\Http\Request;
use App\Http\Controllers\API\BaseController as BaseController;
use App\User;
use Illuminate\Support\Facades\Auth;
use Validator;

class RegisterController extends BaseController
{
    /**
     * Register api
     *
     * @return \Illuminate\Http\Response
     */

    public function register(Request $request)
    {

        $validator = Validator::make($request->all(), [

            'name' => 'required',
            'email' => 'required|email',
            'password' => 'required',
            'c_password' => 'required|same:password',

        ]);

        if($validator->fails()){

            return $this->sendError('Validation Error.', $validator->errors());       
        }

        $input = $request->all();
        $input['password'] = bcrypt($input['password']);
        $user = User::create($input);

        $success['token'] =  $user->createToken('MyApp')->accessToken;
        $success['name'] =  $user->name;

   

        return $this->sendResponse($success, 'User register successfully.');

    }

    /**
     * Login api
     *
     * @return \Illuminate\Http\Response
     */

    public function login(Request $request)
    {

        if(Auth::attempt(['email' => $request->email, 'password' => $request->password])){ 

            $user = Auth::user(); 

            $success['token'] =  $user->createToken('MyApp')-> accessToken; 

            $success['name'] =  $user->name;   

            return $this->sendResponse($success, 'User login successfully.');
        } 
        else{ 

            return $this->sendError('Unauthorised.', ['error'=>'Unauthorised']);

        } 
    }
}

Efectuada la prueba todo funciona correctamente, el usuario se registra en la base de datos y nos devuelve un token para poder operar con el.

A partir de este punto creo que ya soy capaz de utilizar Laravel para poder realizar peticiones y registros en la tabla, como mi intención de momento es la de mostrar por web los mapas creados hasta que no los genere con la aplicación no avanzaré en este punto. Espero poder haber ayudado a alguien tal y como me esta sirviendo a mi.