Restablecimiento de contraseñas – Documentación de Laravel 6

Introducción

¿Quieres comenzar rápido? Instala el paquete de Composer laravel/ui y ejecuta php artisan ui vue --auth en una aplicación de Laravel nueva. Luego de migrar tu base de datos, navega hasta http://your-app.test/register o cualquier otra URL asignada a tu aplicación. Este simple comando se encargará de maquetar todo tu sistema de autenticación, ¡incluyendo el restablecimiento de contraseñas!.

La mayoría de las aplicaciones web proporcionan una forma para que los usuarios restablezcan sus contraseñas olvidadas. En lugar de forzarte a reimplementar esto en cada aplicación, Laravel proporciona métodos convenientes para enviar recordatorios de contraseñas y realizar restablecimientos de contraseñas.

Antes de usar las características de restablecimiento de contraseñas de Laravel, tu usuario debe usar el trait Illuminate\Notifications\Notifiable.

Consideraciones de la base de datos

Para comenzar, verifica que tu modelo App\User implementa el contrato Illuminate\Contracts\Auth\CanResetPassword. El modelo App\User incluido con el framework ya implementa esta interfaz y usa el trait Illuminate\Auth\Passwords\CanResetPassword para incluir los métodos necesarios para implementar la interfaz.

Generando la migración para la tabla de tokens de restablecimiento

Luego, una tabla debe ser creada para almacenar los tokens de restablecimiento de contraseña. La migración para está tabla está incluida con Laravel por defecto y se encuentra en el directorio database/migrations. Así que, todo lo que necesitas hacer es ejecutar tus migraciones de la base de datos:

php artisan migrate

Enrutamiento

Laravel incluye las clases Auth\ForgotPasswordController y Auth\ResetPasswordController que contienen la lógica necesaria para enviar enlaces de restablecimiento de contraseña por correo electrónico y restablecer contraseñas de usuarios. Todas las rutas necesarias para realizar restablecimiento de contraseñas pueden ser generadas usando el paquete de Composer: laravel/ui:

composer require laravel/ui --dev

php artisan ui vue --auth

Vistas

Para generar todas las vistas necesarias para el restablecimiento de contraseñas, puedes usar el paquete de Composer laravel/ui:

composer require laravel/ui --dev

php artisan ui vue --auth

Estas vistas están ubicadas en resources/views/auth/passwords. Eres libre de personalizarlas según sea necesario para tu aplicación.

Después de restablecer contraseñas

Una vez que has definido las rutas y vistas para restablecer las contraseñas de tus usuarios, puedes acceder a la ruta en tu navegador en /password/reset. El ForgotPasswordController incluido con el framework ya incluye la lógica para enviar los correos con el enlace de restablecimiento, mientras que ResetPasswordController incluye la lógica para restablecer las contraseñas de los usuarios.

Luego de que una contraseña es restablecida, la sesión del usuario será automáticamente iniciada y será redirigido a /home. Puedes personalizar la ubicación de redirección definiendo una propiedad redirectTo en ResetPasswordController:

protected $redirectTo = '/dashboard';

Por defecto, los tokens para restablecer contraseñas expiran luego de una hora. Puedes cambiar esto mediante la opción de restablecimiento de contraseñas expire en tu archivo config/auth.php.

Personalización

Personalización de los guards de autenticación

En tu archivo de configuración auth.php, puedes configurar múltiples «guards», que podrán ser usados para definir el comportamiento de autenticación para múltiples tablas de usuarios. Puedes personalizar el controlador ResetPasswordController incluido para usar el guard de tu preferencia sobrescribiendo el método guard en el controlador. Este método debe retornar una instancia guard:

use Illuminate\Support\Facades\Auth;

/**
* Get the guard to be used during password reset.
*
* @return \Illuminate\Contracts\Auth\StatefulGuard
*/
protected function guard()
{
    return Auth::guard('guard-name');
}

Personalización del broker de contraseña

En tu archivo de configuración auth.php, puedes configurar múltiples «brokers» de contraseñas, que pueden ser usados para restablecer contraseñas en múltiples tablas de usuarios. Puedes personalizar los controladores ForgotPasswordController y ResetPasswordController incluidos para usar el broker de tu elección sobrescribiendo el método broker:

use Illuminate\Support\Facades\Password;

/**
* Get the broker to be used during password reset.
*
* @return PasswordBroker
*/
public function broker()
{
    return Password::broker('name');
}

Personalización del correo de reseteo

Puedes fácilmente modificar la clase de la notificación usada para enviar el enlace de restablecimiento de contraseña al usuario. Para comenzar, sobrescribe el método sendPasswordResetNotification en tu modelo User. Dentro de este método, puedes enviar la notificación usando cualquier clase de notificación que selecciones. El $token de restablecimiento de contraseña es el primer argumento recibido por el método:

/**
* Send the password reset notification.
*
* @param  string  $token
* @return void
*/
public function sendPasswordResetNotification($token)
{
    $this->notify(new ResetPasswordNotification($token));
}

Hashing – Documentación de Laravel 6

Introducción

El facade Hash de Laravel proporciona hashing seguro de Bcrypt y Argon2 para almacenar contraseñas de usuarios. Si estás usando las clases integradas LoginController y RegisterController que están incluidas con tu aplicación de Laravel, usarán Bcrypt para registro y autenticación de forma predeterminada.

Bcrypt es una buena opción para el hashing de contraseñas dado que su «factor de trabajo» es ajustable, lo que quiere decir que el tiempo que toma generar un hash puede ser aumentado a medida que la capacidad de hardware incrementa.

Configuración

El driver de hashing por defecto para tu aplicación está configurado en el archivo de configuración config/hashing.php. Actualmente hay tres drivers soportados: Bcrypt y Argon2 (variantes Argon2i y Argon2id).

El driver Argon2i requiere PHP 7.2.0 o superior y el driver Argon2id requiere PHP 7.3.0 o superior.

Uso básico

Puedes hacer hash a una contraseña llamando al método make en el facade Hash:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;

class UpdatePasswordController extends Controller
{
    /**
    * Update the password for the user.
    *
    * @param  Request  $request
    * @return Response
    */
    public function update(Request $request)
    {
        // Validate the new password length...

        $request->user()->fill([
            'password' => Hash::make($request->newPassword)
        ])->save();
    }
}

Ajustando el factor de trabajo de Bcrypt

Si estás usando el algoritmo Bcrypt, el método make te permite administrar el factor de trabajo del algoritmo usando la opción rounds; sin embargo, el valor por defecto es aceptable para la mayoría de las aplicaciones:

$hashed = Hash::make('password', [
    'rounds' => 12
]);

Ajustando el factor de trabajo de Argon2

Si estás usando el algoritmo de Argon2, el método make te permite administrar el factor de trabajo del algoritmo usando las opciones memory, time y threads; sin embargo, los valores por defecto son aceptables para la mayoría de las aplicaciones:

$hashed = Hash::make('password', [
    'memory' => 1024,
    'time' => 2,
    'threads' => 2,
]);

Para mayor información de estas opciones, revisa la documentación oficial de PHP.

Verificando una contraseña contra un hash

El método check te permite verificar que una cadena de texto plano dada corresponde a un hash dado. Sin embargo, si estás usando el LoginController incluido con Laravel, probablemente no necesitarás usar esto directamente, ya que este controlador automáticamente llama a este método:

if (Hash::check('plain-text', $hashedPassword)) {
    // The passwords match...
}

Comprobando si una contraseña necesita un nuevo hash

La función needsRehash te permite determinar si el factor de trabajo usado por el hasher ha cambiado desde que el hash fue agregado a la contraseña:

if (Hash::needsRehash($hashed)) {
    $hashed = Hash::make('plain-text');
}

Cifrado – Documentación de Laravel 6

Introducción

El cifrado de Laravel utiliza OpenSSL para proporcionar el cifrado AES-256 y AES-128. Se recomienda encarecidamente usar las funciones de cifrado incorporadas de Laravel y no intentar utilizar algoritmos de cifrado «hechos por ti mismo». Todos los valores cifrados de Laravel son firmados utilizando un código de autenticación de mensaje (MAC) para que su valor subyacente no pueda modificarse una vez cifrado.

Configuración

Antes de usar el cifrado de Laravel, debes establecer la opción key en tu archivo de configuración config/app.php. Deberías usar el comando php artisan key:generate para generar esta clave, ya que este comando de Artisan usará el generador de bytes aleatorios seguros de PHP para construir tu clave. Si este valor no se establece correctamente, todos los valores cifrados por Laravel serán inseguros.

Usando el cifrador

Cifrar un valor

Puedes cifrar un valor usando el helper o función de ayuda encrypt. Todos los valores cifrados se cifran utilizando OpenSSL y el cifrado AES-256-CBC. Además, todos los valores cifrados están firmados con un código de autenticación de mensaje (MAC) para detectar cualquier modificación en la cadena cifrada:

<?php

namespace App\Http\Controllers;

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

class UserController extends Controller
{
    /**
    * Store a secret message for the user.
    *
    * @param  Request  $request
    * @param  int  $id
    * @return Response
    */
    public function storeSecret(Request $request, $id)
    {
        $user = User::findOrFail($id);

        $user->fill([
            'secret' => encrypt($request->secret),
        ])->save();
    }
}

Cifrado sin serialización

Los valores cifrados se pasan a través de una serialización durante el proceso de cifrado, lo que permite el cifrado de objetos y arreglos. De este modo, los clientes que no son PHP y reciben valores cifrados tendrán que des-serializar los datos. Si deseas cifrar y descifrar valores sin serialización, puede usar los métodos encryptString y decryptString de la facade Crypt:

use Illuminate\Support\Facades\Crypt;

$encrypted = Crypt::encryptString('Hello world.');

$decrypted = Crypt::decryptString($encrypted);

Descifrando un valor

Puedes descifrar los valores usando el helper o función de ayuda decrypt. Si el valor no se puede descifrar correctamente, como cuando el MAC no es válido, se lanzará una excepción Illuminate\Contracts\Encryption\DecryptException:

use Illuminate\Contracts\Encryption\DecryptException;

try {
    $decrypted = decrypt($encryptedValue);
} catch (DecryptException $e) {
    //
}

Verificación de Correo Electrónico – Documentación de Laravel 6

Introducción

Muchas aplicaciones web requieren que los usuarios verifiquen sus correos electrónicos antes de usar la aplicación. En lugar de forzarte a volver a implementar esto en cada aplicación, Laravel proporciona métodos convenientes para enviar y verificar solicitudes de verificación de correos electrónicos.

Preparación del modelo

Para comenzar, verifica que tu modelo App\User implementa la interfaz Illuminate\Contracts\Auth\MustVerifyEmail:

<?php

namespace App;

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

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable;

    // ...
}

Consideraciones de la base de datos

Columna de verificación de correo electrónico

Luego, tu tabla users debe contener una columna email_verified_at para almacenar la fecha y la hora en la que la dirección de correo electrónico fue verificada. Por defecto, la migración de la tabla users incluida con el framework Laravel ya incluye esta columna. Así que, lo único que necesitas es ejecutar la migración de la base de datos:

php artisan migrate

Rutas

Laravel incluye la clase Auth\VerificationController que contiene la lógica necesaria para enviar enlaces de verificación y verificar correos electrónicos. Para registrar las rutas necesarias para este controlador, pasa la opción verify al método Auth::routes:

Auth::routes(['verify' => true]);

Ver post

Autorización – Documentación de Laravel 6

Introducción

Además de proveer servicios de autenticación por defecto, Laravel además provee una forma simple de autorizar acciones del usuario contra un recurso dado. Como con la autenticación, el enfoque de Laravel para la autorización es simple, y hay dos maneras principales de autorizar acciones: gates y policies (puertas y políticas).

Piensa en los gates y políticas como rutas y controladores. Los Gates proveen una manera simple, basada en funciones anónimas, para definir las reglas de autorización; mientras que las políticas, como los controladores, agrupan la lógica para un modelo o recurso en específico. Vamos a explorar los gates primero y luego las políticas.

No necesitas elegir entre el uso exclusivo de gates o de políticas cuando construyas una aplicación. Lo más probable es que la mayoría de las aplicaciones contengan una mezcla de gates y de políticas ¡Y eso está completamente bien! Los gates son más aplicables a acciones que no estén relacionadas a ningún modelo o recurso, como por ejemplo ver el panel de control de un administrador. Por otro lado, las políticas deberán ser usadas cuando desees autorizar una acción para un modelo o recurso en particular.

Gates

Ver post

Autenticación de API – Documentación de Laravel 6

Introducción

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 solicitud 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.

Configuración

Ver post

Autenticación – Documentación de Laravel 6

Introducción

¿Quieres comenzar rápido? Instala el paquete de Composer laravel/ui (1.0) y ejecuta php artisan ui vue --auth en una nueva aplicación de Laravel. Luego de migrar tu base de datos, dirígete en tu navegador a http://tu-app.test/register o cualquier otra URL asignada a tu aplicación. ¡Estos dos comandos se encargarán de generar todo el sistema de autenticación!

Laravel hace la implementación de la autenticación algo muy sencillo. De hecho, casi todo se configura para ti por defecto. El archivo de configuración de la autenticación está localizado en config/auth.php, el cual contiene varias opciones bien documentadas para ajustar el comportamiento de los servicios de autenticación.

En esencia, las características de la autenticación de Laravel están compuestas de «guards» (guardias) y «providers» (proveedores). Los Guards definen cómo los usuarios son autenticados para cada petición. Por ejemplo, Laravel contiene un guard session el cual mantiene el estado utilizando el almacenamiento de sesión y las cookies.

Los proveedores definen cómo se retornan los usuarios de tu almacenamiento persistente. Laravel cuenta con soporte para recuperar los usuarios utilizando Eloquent y el constructor de consultas de la base de datos. Sin embargo, eres libre de definir los proveedores adicionales que requiera tu aplicación.

¡No te preocupes si esto suena confuso por el momento! Muchas aplicaciones nunca necesitarán modificar la configuración predeterminada de la autenticación.

Ver post

Compilación De Assets (Laravel Mix) – Documentación de Laravel 6

Introducción

Laravel Mix proporciona una API fluida para definir pasos de compilación de Webpack para tu aplicación de Laravel usando múltiples preprocesadores de CSS y JavaScript. A través de encadenamiento de métodos simples, puedes definir fluidamente tus pipelines de assets. Por ejemplo:

mix.js('resources/js/app.js', 'public/js')
    .sass('resources/sass/app.scss', 'public/css');

Si alguna vez has estado confundido o agobiado al comenzar con Webpack y la compilación de assets, amarás Laravel Mix. Sin embargo, no estás obligado a usarlo durante el desarrollo de tu aplicación. Eres libre de usar cualquier pipeline de assets que desees o incluso ninguno.

Instalación y configuración

Instalando Node

Antes de ejecutar Mix, debes asegurarte que Node.js y NPM están instalados en tu máquina.

node -v
npm -v

Por defecto, Laravel Homestead incluye todo lo que necesitas; sin embargo, si no estás usando Vagrant, entonces puedes fácilmente instalar la última versión de Node y NPM usando instaladores sencillos desde su página de descargas.

Laravel Mix

El único paso restante es instalar Laravel Mix. Dentro de una instalación nueva de Laravel, encontrarás un archivo package.json en la raíz de tu estructura de directorios. El archivo por defecto package.json incluye todo lo que necesitas para comenzar. Piensa en éste como tu archivo composer.json, excepto que define dependencias de Node en lugar de PHP. Puedes instalar las dependencias a las cuales hace referencia ejecutando:

npm install

Ejecutando Mix

Mix es una capa de configuración basado en Webpack, así que para ejecutar tus tareas de Mix sólo necesitas ejecutar uno de los scripts de NPM incluidos en el archivo package.json por defecto de Laravel:

// Run all Mix tasks...
npm run dev

// Run all Mix tasks and minify output...
npm run production

Observando cambios en los assets

El comando npm run watch continuará ejecutándose en tu terminal y observando todos los archivos relevantes por cambios. Webpack entonces automáticamente recompilará tus assets cuando detecte un cambio:

npm run watch

Puedes encontrar que en algunos entornos Webpack no está actualizando los cambios en tus archivos. Si éste es el caso en tu sistema, considera usar el comando watch-poll:

npm run watch-poll

Trabajando con hojas de estilos

El archivo webpack.mix.js es el punto de entrada para toda la compilación de assets. Piensa en éste como un wrapper de configuración liviano alrededor de Webpack. Las tareas de Mix pueden ser encadenadas para definir exactamente cómo tus assets deben ser compilados.

Ver post

JavaScript y Estructuración de CSS – Documentación de Laravel 6

Introducción

Mientras Laravel no dicta la pauta sobre qué pre-procesadores de JavaScript o CSS usar, si proporciona un punto de inicio básico usando Bootstrap, React y / o Vue que será de utilidad para muchas aplicaciones. De forma predeterminada, Laravel usa NPM para instalar ambos paquetes de frontend.

La estructura de Bootstrap y Vue proporcionada por Laravel se encuentra en el paquete de Composer laravel/ui, que se puede instalar usando Composer:

composer require laravel/ui:^1.0 --dev

Una vez que se haya instalado el paquete laravel/ui, puedes instalar la estructura del frontend usando el comando ui de Artisan:

// Generate basic scaffolding...
php artisan ui bootstrap
php artisan ui vue
php artisan ui react

// Generate login / registration scaffolding...
php artisan ui bootstrap --auth
php artisan ui vue --auth
php artisan ui react --auth

CSS

Laravel Mix proporciona una clara y expresiva API sobre compilación de Sass o Less, las cuales son extensiones de CSS plano que agregan variables, mixins y otras poderosas características que hacen el trabajo con CSS mucho más divertido. En este documento, discutiremos brevemente la compilación CSS en general; sin embargo, deberías consultar la documentación de Laravel Mix completa para mayor información sobre compilación de Sass o Less.

JavaScript

Laravel no requiere que uses un framework o librería de JavaScript específica para construir tus aplicaciones. De hecho, no tienes que usar JavaScript en lo absoluto. Sin embargo, Laravel sí incluye algunas de las estructuras básicas para hacer más fácil los primeros pasos para escribir JavaScript moderno usando el framework Vue. Vue proporciona una API expresiva para construir aplicaciones de JavaScript robustas usando componentes. Como con CSS, podemos usar Laravel Mix para compilar fácilmente componentes de JavaScript en un único archivo de JavaScript para los eventos del navegador.

Escribiendo CSS

Después de instalar el paquete de Composer laravel/ui y generada la estructura del frontend,
el archivo package.json de Laravel incluye el paquete bootstrap que te ayuda a empezar a hacer un prototipo del frontend de tu aplicación usando Bootstrap. Sin embargo, siéntete libre de agregar o eliminar los paquetes del archivo package.json como sea necesario para tu aplicación. No es obligatorio que uses el framework Bootstrap para construir tu aplicación de Laravel – se proporciona como un buen punto de inicio para aquellos que elijan usarlo.

Antes de compilar tu CSS, instala las dependencias de frontend de tu proyecto usando el gestor de paquetes para Node (NPM):

npm install

Una vez que las dependencias hayan sido instaladas usando npm install, puedes compilar tus archivos Sass a CSS plano usando Laravel Mix. El comando npm run dev procesará las instrucciones en tu archivo webpack.mix.js. Típicamente, tu CSS compilado estará ubicado en el directorio public/css:

npm run dev

El archivo webpack.mix.js incluido de forma predeterminada con Laravel compilará el archivo Sass resources/sass/app.scss. Este archivo app.scss importa un archivo de variables Sass y carga Bootstrap, el cual proporciona un buen punto de comienzo para la mayoría de las aplicaciones. Siéntete libre de personalizar el archivo app.scss en la forma que desees o incluso usar un pre-procesador completamente diferente configurando Laravel Mix.

Escribiendo JavaScript

Todas las dependencias de JavaScript requeridas por tu aplicación pueden ser encontradas en el archivo package.json en el directorio principal del proyecto. Este archivo es similar a un archivo composer.json excepto que éste especifica las dependencias de JavaScript en lugar de las dependencias de PHP. Puedes instalar estas dependencias usando el gestor de paquetes de Node (NPM):

npm install

De forma predeterminada, el archivo package.json de Laravel incluye unos cuantos paquetes tales como lodash y axios para ayudarte a empezar a construir tu aplicación de JavaScript. Siéntete libre de agregar o eliminar del archivo package.json según sea necesario para tu aplicación.

Una vez que los paquetes sean instalados, puedes usar el comando npm run dev para compilar tus recursos. Webpack es un empaquetador de módulos para aplicaciones modernas en JavaScript. Cuando ejecutes el comando npm run dev, Webpack ejecutará las instrucciones en tu archivo webpack.mix.js:

npm run dev

De forma predeterminada, el archivo de webpack.mix.js de Laravel compila tu archivo Sass y el de resources/js/app.js. Dentro del archivo app.js puedes registrar tus componentes de Vue o, si prefieres un framework distinto, configurar tu propia aplicación de JavaScript. Tu JavaScript compilado será colocado típicamente en el directorio public/js.

El archivo app.js cargará el archivo resources/js/bootstrap.js el cual estructura y configura Vue, Axios, jQuery, y todas las demás dependencias de JavaScript. Si tienes dependencias adicionales de JavaScript que configurar, puedes hacerlo en este archivo.

Ver post

Configuración Regional – Documentación de Laravel 6

Introducción

Las características de configuración regional de Laravel proporcionan una forma conveniente de retornar cadenas en varios idiomas, permitiéndote soportar fácilmente múltiples idiomas en tu aplicación. Las cadenas de idiomas son almacenadas en archivos dentro del directorio resources/lang. Dentro de este directorio debería haber un subdirectorio para cada idioma soportado por la aplicación:

/resources
    /lang
        /en
            messages.php
        /es
            messages.php

Todos los archivos de idioma retornan un arreglo de cadenas con sus claves. Por ejemplo:

<?php

return [
    'welcome' => 'Welcome to our application'
];

Para idiomas que difieren por territorio, debes nombrar los directorios de idiomas según la ISO 15897. Por ejemplo, «en_GB» debe ser usado para inglés británico en lugar de «en-gb».

Ver post

Suscríbete a nuestro boletín

Te enviaremos publicaciones con consejos útiles y múltiples recursos para que sigas aprendiendo.

Suscríbete a nuestro boletín

Recibe consejos útiles, promos y múltiples recursos directamente en tu correo.

Tu nombre y correo serán enviados directamente a MailChimp. No compartiremos tus datos con otras empresas.