|
|
(4 revisiones intermedias por el mismo usuario no mostrado) |
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 |
| composer require "laravel/breeze" | | composer require "laravel/breeze" |
Línea 51: |
Línea 51: |
| | | |
| | | |
− | | + | }}--> |
| | | |
| | | |
Línea 63: |
Línea 63: |
| *Laravel nos ofrece la autentificación como un servicio. | | *Laravel nos ofrece la autentificación como un servicio. |
| *Laravel tiene preconfigurada la autentificación la cual la podemos activar de manera sencilla. | | *Laravel tiene preconfigurada la autentificación la cual la podemos activar de manera sencilla. |
− | ====Autentificación implementada en Laravel==== | + | *Sistemas de authentificación posibles con laravel: |
− | ;Fichero de configuración
| + | #Autentificación básica con http |
− | config/auth.php
| + | #Breeze |
| + | #Fortity |
| + | #Jetstream |
| + | #Sanctum |
| + | #Passport |
| + | <!-- |
| + | ====Autentificación básica con http==== |
| | | |
− | *Un listado de este fichero
| |
− | {{Plegable|hide|config.php|
| |
− | <source lang=php>
| |
− | <?php
| |
− | <?php
| |
| | | |
− | return [
| |
− |
| |
− | /*
| |
− | |--------------------------------------------------------------------------
| |
− | | Authentication Defaults
| |
− | |--------------------------------------------------------------------------
| |
− | |
| |
− | | This option controls the default authentication "guard" and password
| |
− | | reset options for your application. You may change these defaults
| |
− | | as required, but they're a perfect start for most applications.
| |
− | |
| |
− | */
| |
− |
| |
− | 'defaults' => [
| |
− | 'guard' => 'web',
| |
− | 'passwords' => 'users',
| |
− | ],
| |
− |
| |
− | /*
| |
− | |--------------------------------------------------------------------------
| |
− | | Authentication Guards
| |
− | |--------------------------------------------------------------------------
| |
− | |
| |
− | | Next, you may define every authentication guard for your application.
| |
− | | Of course, a great default configuration has been defined for you
| |
− | | here which uses session storage and the Eloquent user provider.
| |
− | |
| |
− | | All authentication drivers have a user provider. This defines how the
| |
− | | users are actually retrieved out of your database or other storage
| |
− | | mechanisms used by this application to persist your user's data.
| |
− | |
| |
− | | Supported: "session"
| |
− | |
| |
− | */
| |
− |
| |
− | 'guards' => [
| |
− | 'web' => [
| |
− | 'driver' => 'session',
| |
− | 'provider' => 'users',
| |
− | ],
| |
− | ],
| |
− |
| |
− | /*
| |
− | |--------------------------------------------------------------------------
| |
− | | User Providers
| |
− | |--------------------------------------------------------------------------
| |
− | |
| |
− | | All authentication drivers have a user provider. This defines how the
| |
− | | users are actually retrieved out of your database or other storage
| |
− | | mechanisms used by this application to persist your user's data.
| |
− | |
| |
− | | If you have multiple user tables or models you may configure multiple
| |
− | | sources which represent each model / table. These sources may then
| |
− | | be assigned to any extra authentication guards you have defined.
| |
− | |
| |
− | | Supported: "database", "eloquent"
| |
− | |
| |
− | */
| |
− |
| |
− | 'providers' => [
| |
− | 'users' => [
| |
− | 'driver' => 'eloquent',
| |
− | 'model' => App\Models\User::class,
| |
− | ],
| |
− |
| |
− | // 'users' => [
| |
− | // 'driver' => 'database',
| |
− | // 'table' => 'users',
| |
− | // ],
| |
− | ],
| |
− |
| |
− | /*
| |
− | |--------------------------------------------------------------------------
| |
− | | Resetting Passwords
| |
− | |--------------------------------------------------------------------------
| |
− | |
| |
− | | You may specify multiple password reset configurations if you have more
| |
− | | than one user table or model in the application and you want to have
| |
− | | separate password reset settings based on the specific user types.
| |
− | |
| |
− | | The expire time is the number of minutes that each reset token will be
| |
− | | considered valid. This security feature keeps tokens short-lived so
| |
− | | they have less time to be guessed. You may change this as needed.
| |
− | |
| |
− | */
| |
− |
| |
− | 'passwords' => [
| |
− | 'users' => [
| |
− | 'provider' => 'users',
| |
− | 'table' => 'password_resets',
| |
− | 'expire' => 60,
| |
− | 'throttle' => 60,
| |
− | ],
| |
− | ],
| |
− |
| |
− | /*
| |
− | |--------------------------------------------------------------------------
| |
− | | Password Confirmation Timeout
| |
− | |--------------------------------------------------------------------------
| |
− | |
| |
− | | Here you may define the amount of seconds before a password confirmation
| |
− | | times out and the user is prompted to re-enter their password via the
| |
− | | confirmation screen. By default, the timeout lasts for three hours.
| |
− | |
| |
− | */
| |
− |
| |
− | 'password_timeout' => 10800,
| |
− |
| |
− | ];
| |
− |
| |
− |
| |
− | </source>
| |
− | }}
| |
− | {{MRM_Puntos clave|Como podemos ver '''''la autentificación''''' en Laravel está configurada por dos elementos que podemos modificar: '''''Guards''''' y '''''Providers'''''.
| |
− | {{MRM_Definicion|Title=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
| |
− | <source lang=bash>
| |
− | apt-get install git
| |
− | curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash
| |
− | </source>
| |
− | El comando nos instalará nodejs 16 y npm en la versión 8
| |
− | <source lang=bash>
| |
− | 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
| |
− | </source>
| |
− | Ahora debemos publicar las rutas, controladores, vistas y otros recursos para la autentificación, para ello ejecutamos el siguiete comando
| |
− |
| |
− | <source lang=bash>
| |
− | php artisan breeze:install
| |
− | </source>
| |
− | *Nos dará el siguiente mensaje
| |
− | <source lang=bash>
| |
− | Breeze scaffolding installed successfully.
| |
− | Please execute the "npm install && npm run dev" command to build your assets.
| |
− | </source>
| |
− | *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
| |
− | <source lang=bash>
| |
− | npm install
| |
− | npm run dev
| |
− | </source>
| |
− | Puede ser que nos indique que instalemos una versión superíor, lo hacemos, como en mi caso
| |
− | <source lang=bash>
| |
− | sudo npm install -g npm@8.5.1
| |
− | </source>
| |
− |
| |
− | *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'''''
| |
− | [[Archivo:auth_env.png|center]]
| |
− | *Ahora ejecutamos las migraciones para crear las tablas
| |
− | <source lang=bash>
| |
− | php artisan migrate
| |
− | </source>
| |
− | Tras ejecutarla, podemos ver cómo nos han creado estas tablas
| |
− | [[Archivo:auth_tablas.png|center]]
| |
− |
| |
− | *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
| |
− |
| |
− | <source lang=php>
| |
− | Route::get('/', function () {
| |
− | return view('welcome');
| |
− | });
| |
− | </source>
| |
− | *Le ponemos la autentificaicón
| |
− | <source lang=php>
| |
− | Route::get('/', function () {
| |
− | return view('welcome');
| |
− | })->middleware("auth");
| |
− | </source>
| |
− | *Y Ahora al solicitar el recurso, nos pide que nos autentifiquemos, redirigiéndonos a la página de login
| |
− | [[Archivo:auth_login.png|center|500px]]
| |
− |
| |
− | ===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.
| |
− | *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=== | + | ====Autentificación implementada en Laravel: Breeze==== |
− | ;make crear una contraseña
| + | *Este paquete aporta los siguientes elementos: |
− | Hash::make('secret');
| + | ;En el backend: |
− | ;check validar una contraseña | + | Vistas |
− | Hash::check('secret',$hashedPassword);
| + | Rutas y controladores |
− | ;Tengo que volver a hacer el hash de una contraseña | + | ;En el frontend |
− | if (Hash::needsRehash($hashed))
| + | Tailwindcss/blade |
− | {
| + | ;Acciones implementadas: |
− | $hashed = Hash::make('secret');
| + | Registro |
− | }
| + | Login |
| + | Logout |
| + | Resestablecimiento de contraseña |
| + | Confirmación por email |
| + | |
| </div> | | </div> |
| + | --> |