Diferencia entre revisiones de «Usuario:ManuelRomero/Laravel/autentificacion/introduccion»

De WikiEducator
Saltar a: navegación, buscar
Línea 3: Línea 3:
 
https://www.youtube.com/watch?v=BXXmboZRLYo
 
https://www.youtube.com/watch?v=BXXmboZRLYo
 
<div class=parrafo>
 
<div class=parrafo>
 
+
<!--
 
{{MRM_actividad|Title=Para recordoar|
 
{{MRM_actividad|Title=Para recordoar|
 
;Instalacion
 
;Instalacion
Línea 51: Línea 51:
  
  
 
+
}}-->
  
  
Línea 316: Línea 316:
 
3.-Restablecimiento de contraseña,  
 
3.-Restablecimiento de contraseña,  
 
4.-Verificación de correo electrónico y confirmación de contraseña.
 
4.-Verificación de correo electrónico y confirmación de contraseña.
*Ahora vamos a estudiar y utilizar la autenticación en una app sencilla
 
*Creamos una app con 4 páginas: about,
 
 
 
 
</source>
 
{{MRM_Pregunta|Title=Qué ha ocurrido|
 
;1.-Se ha creado una carpeta en controller llamda '''''Auth''''' con 8 controladores (app/Http/Controller/Auth)
 
 
[[Imagen:auth_controller.png|400px|center]]
 
 
;2.-Se ha añadido nuevas entradas en las rutas routes/web.app
 
<source lang=php>
 
//...
 
Auth::routes();
 
Route::get('/home', 'HomeController@index');
 
//...
 
</source>
 
;3.-Se han creado un fichero en routes que se añade a web.php : ''''''auth.php'''''. Cada ruta usa métodos de los controladores
 
{{plegable|hide|auth.php|
 
<source lang=php>
 
<?php
 
 
use App\Http\Controllers\Auth\AuthenticatedSessionController;
 
use App\Http\Controllers\Auth\ConfirmablePasswordController;
 
use App\Http\Controllers\Auth\EmailVerificationNotificationController;
 
use App\Http\Controllers\Auth\EmailVerificationPromptController;
 
use App\Http\Controllers\Auth\NewPasswordController;
 
use App\Http\Controllers\Auth\PasswordResetLinkController;
 
use App\Http\Controllers\Auth\RegisteredUserController;
 
use App\Http\Controllers\Auth\VerifyEmailController;
 
use Illuminate\Support\Facades\Route;
 
 
Route::middleware('guest')->group(function () {
 
    Route::get('register', [RegisteredUserController::class, 'create'])
 
                ->name('register');
 
 
    Route::post('register', [RegisteredUserController::class, 'store']);
 
 
    Route::get('login', [AuthenticatedSessionController::class, 'create'])
 
                ->name('login');
 
 
    Route::post('login', [AuthenticatedSessionController::class, 'store']);
 
 
    Route::get('forgot-password', [PasswordResetLinkController::class, 'create'])
 
                ->name('password.request');
 
 
    Route::post('forgot-password', [PasswordResetLinkController::class, 'store'])
 
                ->name('password.email');
 
 
    Route::get('reset-password/{token}', [NewPasswordController::class, 'create'])
 
                ->name('password.reset');
 
 
    Route::post('reset-password', [NewPasswordController::class, 'store'])
 
                ->name('password.update');
 
});
 
 
Route::middleware('auth')->group(function () {
 
    Route::get('verify-email', [EmailVerificationPromptController::class, '__invoke'])
 
                ->name('verification.notice');
 
 
    Route::get('verify-email/{id}/{hash}', [VerifyEmailController::class, '__invoke'])
 
                ->middleware(['signed', 'throttle:6,1'])
 
                ->name('verification.verify');
 
 
    Route::post('email/verification-notification', [EmailVerificationNotificationController::class, 'store'])
 
                ->middleware('throttle:6,1')
 
                ->name('verification.send');
 
 
    Route::get('confirm-password', [ConfirmablePasswordController::class, 'show'])
 
                ->name('password.confirm');
 
 
    Route::post('confirm-password', [ConfirmablePasswordController::class, 'store']);
 
 
    Route::post('logout', [AuthenticatedSessionController::class, 'destroy'])
 
                ->name('logout');
 
});
 
 
</source>
 
}}
 
Otra forma de ver las rutas es con el comando de php artisan:
 
<source lang=bash>
 
php artisan route:list
 
[[Archivo:auth_route_list.png|center]]
 
</source>
 
}}
 
{{MRM_Actividad|Title=Controladores disponibles para autentificar|
 
;AuthenticationSessionController.php
 
*Este controlador gestiona el logín de la autentificación y establece cuál es la página a la que se redirige la primera vez que nos autentificamos. Tiene 3 métodos
 
;create => retorna la vista de login
 
;store => guarda y si necesita regenera el usuario en clave de sesión
 
;destroy
 
*Con él podremos gestionar las solicitudes después haber sido logueados.
 
;RegisterController
 
Registro del usuarios
 
;LoginController
 
Gestiona la autentificación.
 
;ForgotPasswordController
 
Gestión de una password olvidada por parte de un usuario
 
;ResetPasswordController
 
Lógica para controlar resetear una password
 
}}
 
{{MRM_Actividad|Title=Invocar a los formuarios|
 
*Podemos invocar a los formularios desde nuestra vista
 
<source lang=html5>
 
  <a class="btn  href= {{ route('register') }}>REGISTRATE</a>
 
  <a class="btn href={{ route('login') }}>ACCEDER</a>
 
</source>
 
}}
 
{{MRM_Actividad|Title=Establecer enlaces con logín|
 
*Los '''''middeleware''''' son filtros que se pueden poner antes o después de acceder a un recurso establecido en '''''web.php'''''
 
*De esta forma podemos establecer que para acceder a determinadas páginas o recursos  hay que loguearse previamente
 
*Por ejemplo tenemos varias páginas con restricciones de acceso, informes, alumnos y empresas serían recursos que necesitarían login para acceder
 
<source lang=php>
 
 
Route::get('/about', function () {
 
    return view('about');
 
});
 
Route::get('/contacta', function () {
 
    return view('contacta');
 
});
 
 
Route::get('/alumnos', function () {
 
    return view('alumnos');
 
})->middleware('auth');
 
Route::get('/informes', function () {
 
    return view('practicas');
 
});
 
Route::get('/empresas', function () {
 
    return view('empresas');
 
})->middleware('auth');
 
 
 
 
 
</source>
 
}}
 
 
 
{{Tip|En muchos casos, activar la autentificación por defecto es suficiente, pero conviene conocer cómo modificar determinados comportamientos por defecto}}
 
{{MRM_Actividad|Ttitle=Personalizando la autentificación|
 
#Página inicial una vez logueado.
 
#Campos para validar al ususario.
 
#Protegiendo rutas.
 
}}
 
 
===Página inicial===
 
<br />
 
{{MRM_Puntos clave|Title=Página a redirigir una vez logueado|
 
;Atributo
 
<source lang=php>
 
protected redirectTo='/home';
 
</source>
 
De los controladores:
 
;LoginController.php
 
;RegisterController.php
 
;ResetPasswordController.php
 
Se puede especificar también el método
 
<source lang=php>
 
protected function redirectTo()
 
{
 
    return '/path';
 
}
 
</source>
 
{{Tip|El método tiene preferencia sobre el atributo}}
 
}}
 
===Protegiendo rutas===
 
*Establecer páginas o rutas, que solo se sirven si se está logueado.
 
*Si tengo una ruta de una página
 
<source lang=php>
 
Route::get('/productos', 'ControladorProductos@get')
 
</source>
 
*Si la quiero proteger con autentificación:
 
<source lang=php>
 
Route::get('/productos', 'ControladorProductos@get')->middleware('auth');
 
</source>
 
 
 
 
<br />
 
 
 
 
 
 
{{MRM_Puntos clave|Title=Migraciones para la autentificación|
 
;1.-Creamos la base de datos
 
;2.-Configuramos correctamente el fichero
 
<source lang=bash>
 
config/database.php
 
</source>
 
Valores de parámetros aportados en el fichero '''''.env'''''
 
[[Imagen:usuariosLaravelMigraciones.png]]
 
;3.-Instalamos el módulo de migraciones
 
<source lang=bash>
 
php artisan migrate:install
 
</source>
 
*Nos habrá creado la tabla '''''migration''''' en la base de datos especificada
 
Migration table created successfully.
 
;4.- Ejecutamos la migración que viene por defecto
 
<source lang=bash>
 
php artisan migrate
 
</source>
 
Nos generará la siguiente salida indicando que ha creado dos tablas
 
Migrating: 2014_10_12_000000_create_users_table
 
Migrated:  2014_10_12_000000_create_users_table
 
Migrating: 2014_10_12_100000_create_password_resets_table
 
Migrated:  2014_10_12_100000_create_password_resets_table
 
}}
 
{{Nota|
 
#Si la primera vez que intentáis registrar un usuario no deja, cierra el servidor y vuélvelo a arrancar y prueba
 
#Verifica el fichero de configuración de las conexiones
 
#Busca en stackoverflow ...
 
}}
 
 
 
{{MRM_Puntos clave|Title=Campo de validación|
 
*Para identificarte por defecto pide el email
 
*Si quieres que solicite otro campo:
 
:1.- Establece el nombre del campo en el controlador LoginControler
 
<source lang=php>
 
public function username(){
 
  return ("name"); //Ahora será este el campo por el que se validará
 
}
 
<br />
 
2.-Ahora toca actualizar la plantilla html que se va a visualizar
 
*Había estas etiquetas
 
<source lang=html5>
 
  <div class="form-group row">
 
    <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
 
        <div class="col-md-6">
 
        <input id="email" type="email" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name="email" value="{{ old('email') }}" required autofocus>
 
        @if ($errors->has('email'))
 
            <span class="invalid-feedback" role="alert">
 
              <strong>{{ $errors->first('email') }}</strong>
 
            </span>
 
        @endif
 
        </div>
 
  </div>
 
</source>
 
Las sustituimos por una caja de texto
 
 
3.-Actualiza la plantilla correspondiente
 
 
}}
 
 
 
 
 
 
 
 
 
 
*La idea es usar un milddeware, entendido como un software intermedio entre la página que solicito y la que el servidor me entrega
 
*De esta forma siempre que solicite una página que necesite estar registrado, antes de servirla voy a verificar si estoy o no registrado
 
*Anteriormente (en veriones 4 o anterior), este concepto se conocía como filtro, ahora en esta versión se conoce como ya hemos comentado como  '''''Middleware'''''.
 
*La idea es antes de cargar una página que se verifica  ver si el usuario está autentificado
 
*La descripción algorítmica sería
 
1.- Si  está registrado  entrego la página solicitada
 
2.- Si no lo está le redirijo a una página de logueo para que se acredite o registre
 
2.-1 Cuando lo haga le doy paso a la página solicitada
 
3.- En caso de no autentificarse le doy una información de error.
 
*En Laravel todo está preparado y configurado, para que con unas pequeñas acciones podamos adaptar esa configuración a nuestras necesidades. Bastaría con hacer las siguientes acciones como indican en la página de referencia
 
<source lang=bash>
 
php artisan make:auth and
 
php artisan migrate
 
</source>
 
Entonces acceemos a nuestra app
 
http://localhost:8000/register
 
 
===Gestionar los datos de la autentificacion===
 
*Por defecto tenemos un modelo llamado '''''User''''' con su tabla por defecto '''''users'''''
 
*Esa tabla logicamente hay que construirla. Podemos hacerlo con migraciones.
 
Entre otros campos debe contener
 
*campo remenber_token de 100 caracteres, permitiendo el valor nulo. Campo usado para recordar entre sesiones
 
*Para incluir este campo con migraciones usaremos
 
<source lang=php>
 
$table->rememberToken()
 
</source>
 
*Para gestionar la validación Laravel incluye el modelo '''''app/User.php'''''
 
 
===Gestión de contraseñas===
 
;make crear una contraseña
 
Hash::make('secret');
 
;check validar una contraseña
 
Hash::check('secret',$hashedPassword);
 
;Tengo que volver a hacer el hash de una contraseña
 
if (Hash::needsRehash($hashed))
 
{
 
    $hashed = Hash::make('secret');
 
}
 
</div>
 

Revisión de 18:00 31 ene 2023


https://www.youtube.com/watch?v=BXXmboZRLYo




Conceptos generales

  • La autentificación es otra de las muchas tareas comunes en cualquier aplicación que en el fondo no es parte de la aplicación sino un nivel de seguridad o compromiso que nuestra app pretende adoptar.
  • Laravel gestiona la autentificación en varios ficheros según vamos a ver a continuación.
  • Laravel nos ofrece la autentificación como un servicio.
  • Laravel tiene preconfigurada la autentificación la cual la podemos activar de manera sencilla.
  • Sistemas de authentificación posibles con laravel:
  1. Autentificación básica con http
  2. Breeze
  3. Fortity
  4. Jetstream
  5. Sanctum
  6. Passport

Autentificación básica con http

Autentificación implementada en Laravel: Breeze

  • Este paquete aporta los siguientes elementos:
En el backend
Vistas
Rutas y controladores
En el frontend
Tailwindcss/blade
Acciones implementadas
Registro
Login
Logout
Resestablecimiento de contraseña
Confirmación por email


Fichero de configuración
config/auth.php
  • Un listado de este fichero


Icon key points.gif

Puntos clave

Como podemos ver la autentificación en Laravel está configurada por dos elementos que podemos modificar: Guards y Providers.


Icon define.gif
Guards y Providers
  • Guards definen cómo el sistema debe de almacenar y recuperar información sobre los usuarios autenticados en cada solicitud. Por ejemplo sesiones o tokens
  • Providers Definen cómo se obtienen los datos almacenados de manera persistente en el sistema. (Base de datos, tabla, campos ...)




Autentificación con laravel

En este caso vamos a generar la autentificación más básica, de las que ofrece laravel que va a consistir en usuario y password

Partimos de un proyecto instalado en laravel, si no, creamos uno nuevo
  • Debemos tener instalado git, node y npm, si no lo tuviéramos instalado lo instalamos
 apt-get install git
 curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash

El comando nos instalará nodejs 16 y npm en la versión 8

node -v
  v16.14.0
npm -v
  8.3.1
➜  ~ 
</node>
 
*Creamos el proyecto nuevo
<source lang=bash>
 laravel new auth
</>
;Instalamos el paquete laravel/breeze que implementa la auth básica pero completa
<source lang=bash>
composer require laravel/breeze

Ahora debemos publicar las rutas, controladores, vistas y otros recursos para la autentificación, para ello ejecutamos el siguiete comando

 php artisan breeze:install
  • Nos dará el siguiente mensaje
Breeze scaffolding installed successfully.
Please execute the "npm install && npm run dev" command to build your assets.
  • Y hacemos lo que pide, ya que esta implementación usa taildwind como css y otros paquetes en el front. Ahora debemos instalar todos los paquetes del cliente, que se necesita para su ejecución.
  • Para este comentido se utiliza la herramienta npm https://www.npmjs.com/ que es un gestor de paquetes de nodejs y lo vamos a usar en laravel para descargar paquetes relaciondos con el front
npm install 
npm run dev

Puede ser que nos indique que instalemos una versión superíor, lo hacemos, como en mi caso

 sudo npm install -g npm@8.5.1
  • Ahora creamos las tablas necesarias para la authentificaicón (user, password_resets y personal_access_token). Éstas ya vienen preparadas en migraciones con la aplicación inicial.

Para ello lo primero establecemos los parámetros de conexión en el fichero de configuración .env

Auth env.png
  • Ahora ejecutamos las migraciones para crear las tablas
php artisan migrate

Tras ejecutarla, podemos ver cómo nos han creado estas tablas

Auth tablas.png
  • Ahora ya podemos usar la autentificación, vemos cómo tenemos nuevas rutas, nuevos controladores y nuevas vistas.
  • Probamos cómo efectivamente funciona creando una ruta que nos retorne una vista y poniéndoe un midellware auth. Todo lo vamos a analizar más despacion, pero observemos su funcionamiento.
  • En web.php tenemos la ruta por defecto de la instalación
Route::get('/', function () {
    return view('welcome');
});
  • Le ponemos la autentificaicón
Route::get('/', function () {
    return view('welcome');
})->middleware("auth");
  • Y Ahora al solicitar el recurso, nos pide que nos autentifiquemos, redirigiéndonos a la página de login
Auth login.png

Estudiando los elementos creados

Breeze utiliza
  • taildwindcss y blade
  • Vistas
  • Rutas y controladores
Todo ello para las siguientes acciones
  • login
  • logout
  • Register
  • Reestablecer contraseña
  • Confirmar email
  • Confirmar contraseña


  • 1.- taildwindcss
  • Incluye una serie de operaciones típicas como son:

1.-Inicio de sesión, 2.-Registro de ususario, 3.-Restablecimiento de contraseña,

4.-Verificación de correo electrónico y confirmación de contraseña.