{"id":272,"date":"2023-01-17T23:34:11","date_gmt":"2023-01-18T02:34:11","guid":{"rendered":"https:\/\/ventiladorcito.com\/blog\/?p=272"},"modified":"2024-03-17T22:20:24","modified_gmt":"2024-03-18T01:20:24","slug":"mascotas-perdidas-py-parte-ii","status":"publish","type":"post","link":"https:\/\/ventiladorcito.com\/blog\/2023\/01\/mascotas-perdidas-py-parte-ii\/","title":{"rendered":"Mascotas Perdidas Py &#8211; Parte II"},"content":{"rendered":"\n<p class=\"has-medium-font-size\"><strong>17 de enero<\/strong><\/p>\n\n\n\n<p>Siempre que leo las diferentes formas de autenticar con Laravel, termino yendo al que mejor entiendo, pero tambi\u00e9n uno un chiqui complicado: <a href=\"https:\/\/laravel.com\/docs\/9.x\/fortify\" target=\"_blank\" rel=\"noreferrer noopener\">Fortify<\/a><\/p>\n\n\n\n<p>\u00bfPor qu\u00e9? No hay porque&#8230;<\/p>\n\n\n\n<p>Hablemos un poquito de Fortify<\/p>\n\n\n\n<p>Fortify es un sistema que se usa en el backend (tras bambalinas) de autenticaci\u00f3n agn\u00f3stico al frontend (eso significa que el registra las rutas para los diferentes procesos: login, registro, cambio de contrase\u00f1a y verificaci\u00f3n de la cuenta) y nosotros debemos de programar las diferentes interfaces, que es algo que a mi me gusta, porque nos da flexibilidad aunque a costa de un poco m\u00e1s de trabajo.<\/p>\n\n\n\n<p>Antes de seguir, voy a crear una nueva rama para el proyecto de modo a que todo lo relacionado con autenticaci\u00f3n y registro est\u00e9 en ella y est\u00e9 disponible m\u00e1s adelante para ser revisado por ustedes.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">git checkout -b fortify-auth<\/code><\/pre>\n\n\n\n<p>Bueno, continuemos, primero tenemos que incluir fortify a nuestro proyecto, eso lo hacemos ejecutando:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">composer require laravel\/fortify<\/code><\/pre>\n\n\n\n<p>Esto incluira en nuestro achivo composer.json los datos de la ultima version estable de fortify, y la instalar\u00e1 en nuestra carpeta vendor, por detr\u00e1s se ejecutar\u00e1 un comando llamado <strong><code>composer dump-autoload<\/code> <\/strong>que lo agrega en el contexto de laravel y as\u00ed ser visible en el proyecto.<\/p>\n\n\n\n<p>Deja una salida similar a esta si es que todo est\u00e1 ok.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">Info from https:\/\/repo.packagist.org: #StandWithUkraine\nUsing version ^1.16 for laravel\/fortify\n.\/composer.json has been updated\nRunning composer update laravel\/fortify\nLoading composer repositories with package information\nInfo from https:\/\/repo.packagist.org: #StandWithUkraine\nUpdating dependencies\nLock file operations: 5 installs, 0 updates, 0 removals\n  - Locking bacon\/bacon-qr-code (2.0.8)\n  - Locking dasprid\/enum (1.0.3)\n  - Locking laravel\/fortify (v1.16.0)\n  - Locking paragonie\/constant_time_encoding (v2.6.3)\n  - Locking pragmarx\/google2fa (v8.0.1)\nWriting lock file\nInstalling dependencies from lock file (including require-dev)\nPackage operations: 5 installs, 0 updates, 0 removals\n  - Downloading bacon\/bacon-qr-code (2.0.8)\n  - Downloading laravel\/fortify (v1.16.0)\n  - Installing dasprid\/enum (1.0.3): Extracting archive\n  - Installing paragonie\/constant_time_encoding (v2.6.3): Extracting archive\n  - Installing pragmarx\/google2fa (v8.0.1): Extracting archive\n  - Installing bacon\/bacon-qr-code (2.0.8): Extracting archive\n  - Installing laravel\/fortify (v1.16.0): Extracting archive\nGenerating optimized autoload files\n> Illuminate\\Foundation\\ComposerScripts::postAutoloadDump\n> @php artisan package:discover --ansi\n\n   INFO  Discovering packages.  \n\n  laravel\/fortify ................................................. DONE\n  laravel\/sail .................................................... DONE\n  laravel\/sanctum ................................................. DONE\n  laravel\/tinker .................................................. DONE\n  nesbot\/carbon ................................................... DONE\n  nunomaduro\/collision ............................................ DONE\n  nunomaduro\/termwind ............................................. DONE\n  spatie\/laravel-ignition ......................................... DONE\n\n80 packages you are using are looking for funding.\nUse the `composer fund` command to find out more!\n> @php artisan vendor:publish --tag=laravel-assets --ansi --force\n\n   INFO  No publishable resources for tag [laravel-assets].<\/code><\/pre>\n\n\n\n<p>Listo, con esto ya podemos hacer uso del backend de autenticaci\u00f3n que nos disponibiliza Fortify.  Una forma de chequear esto es ejecutando:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">php artisan route:list<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2023\/01\/image-2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"919\" height=\"474\" src=\"https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2023\/01\/image-2.png\" alt=\"\" class=\"wp-image-275\" srcset=\"https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2023\/01\/image-2.png 919w, https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2023\/01\/image-2-300x155.png 300w, https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2023\/01\/image-2-768x396.png 768w, https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2023\/01\/image-2-624x322.png 624w\" sizes=\"auto, (max-width: 919px) 100vw, 919px\" \/><\/a><figcaption class=\"wp-element-caption\">En esta vemos resaltadas todas las rutas que fortify genera para nosotros, como login, register, etc&#8230;<\/figcaption><\/figure>\n\n\n\n<p>Con esto podemos apreciar todas las rutas disponibles en el sistema actualmente.<\/p>\n\n\n\n<p>Luego procedemos a publicar los recursos que Fortify tiene en vendor (recordar que los recursos mientras estan en vendor, no van a ser modificables por nosotros, o por lo menos no entrar\u00e1n en el versionado que manejamos, por eso se extraen del vendor y se colocan dentro de nuestras carpetas) ejecutando el comando:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">php artisan vendor:publish \\\n--provider=\"Laravel\\Fortify\\FortifyServiceProvider\"<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2023\/01\/image-3.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"161\" src=\"https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2023\/01\/image-3-1024x161.png\" alt=\"\" class=\"wp-image-276\" srcset=\"https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2023\/01\/image-3-1024x161.png 1024w, https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2023\/01\/image-3-300x47.png 300w, https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2023\/01\/image-3-768x121.png 768w, https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2023\/01\/image-3-624x98.png 624w, https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2023\/01\/image-3.png 1281w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Alli podemos ver que se publican las acciones (la mayor\u00eda son reglas de validaciones para registro y\/o cambio de password); el FortifyServiceProvider que registra esas acciones en el inicio (boot) del sistema; y las migracion que agrega la tabla para tener autenticaci\u00f3n en dos pasos disponible.<\/p>\n\n\n\n<p>Ahora correremos las migraciones, que de hecho las tenemos pendiente desde la entrada anterior, y se crearan las tablas: users, password_resets, personal_access_token, y dos tablas mas que son con las que laravel controla las migraciones ejecutadas: migrations y failed_jobs.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2023\/01\/image-4.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"124\" src=\"https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2023\/01\/image-4-1024x124.png\" alt=\"\" class=\"wp-image-277\" srcset=\"https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2023\/01\/image-4-1024x124.png 1024w, https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2023\/01\/image-4-300x36.png 300w, https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2023\/01\/image-4-768x93.png 768w, https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2023\/01\/image-4-624x76.png 624w, https:\/\/ventiladorcito.com\/blog\/wp-content\/uploads\/2023\/01\/image-4.png 1268w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p> <\/p>\n\n\n\n<p>Luego agregamos la siguiente linea al archivo <strong>config\/app.php<\/strong> para registrar las acciones de fortify en el sistema, espec\u00edficamente en el array de <strong><em>providers<\/em><\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">App\\Providers\\FortifyServiceProvider::class<\/code><\/pre>\n\n\n\n<p>Luego procedemos a modificar el archivo <strong>config\/fortify.php<\/strong>, y vamos a la secci\u00f3n de features (caracter\u00edsticas) y solo dejaremos activadas las de registro, cambio de password y verificaci\u00f3n de emails.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">    'features' => [\n        Features::registration(),\n        Features::resetPasswords(),\n        Features::emailVerification(),\n        \/\/ Features::updateProfileInformation(),\n        \/\/ Features::updatePasswords(),\n        \/\/ Features::twoFactorAuthentication([\n        \/\/     'confirm' => true,\n        \/\/     'confirmPassword' => true,\n        \/\/     \/\/ 'window' => 0,\n        \/\/ ]),\n    ],<\/code><\/pre>\n\n\n\n<p>A continuaci\u00f3n tenemos que indicar a Fortify, cual sera nuestra vista para login (que aparte debemos crearla, pero les mostrar\u00e9 un recurso que nos ser\u00e1 \u00fatil) para ello editamos el archivo <strong>app\/Providers\/FortifyServiceProvider.php<\/strong> <\/p>\n\n\n\n<p>en el m\u00e9todo <strong>boot<\/strong> agregamos el c\u00f3digo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">    public function boot(): void\n    {\n        Fortify::loginView(function () {\n            return view('auth.login');\n        });\n        \/\/...<\/code><\/pre>\n\n\n\n<p>Con esto Fortify ira a la vista <strong>login.blade.php<\/strong> que estar\u00e1 dentro de la carpeta <strong>auth<\/strong>.<\/p>\n\n\n\n<p>Luego de esa entrada agregamos las siguientes que necesitamos para registrar usuarios, el formulario de me olvide mi contrase\u00f1a, el formulario para cambiar de contrase\u00f1a, y la vista que muestra el mensaje de que necesitamos verificar la cuenta para continuar.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">        \/\/...\n        Fortify::registerView(function () {\n            return view('auth.register');\n        });\n\n        Fortify::requestPasswordResetLinkView(function () {\n            return view('auth.forgot-password');\n        });\n\n        Fortify::resetPasswordView(function ($request) {\n            return view('auth.reset-password', ['request' => $request]);\n        });\n\n        Fortify::verifyEmailView(function () {\n            return view('auth.verify-email');\n        });\n        \/\/...<\/code><\/pre>\n\n\n\n<p>Con eso listo ya instruimos a Fortify cuales seran nuestras vistas, ahora continuaremos con la modificacion de nuestro modelo de Users, para indicarle que debe implementar las funcionalidades de verificacion de email, para ellos descomentamos la linea (o agregamos si no est\u00e1) <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">use Illuminate\\Contracts\\Auth\\MustVerifyEmail;<\/code><\/pre>\n\n\n\n<p>y tambi\u00e9n le decimos que agregue el trait de MustVerify email<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">class User extends Authenticatable\n{\n    use HasApiTokens, HasFactory, Notifiable, \/* Esta -> *\/ MustVerifyEmail;<\/code><\/pre>\n\n\n\n<p>Por hoy eso es todo, procedemos a agregar al repositorio todos los archivos creados y modificados:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">git add app\/Actions\/ app\/Providers\/FortifyServiceProvider.php config\/fortify.php database\/migrations\/2014_10_12_200000_add_two_factor_columns_to_users_table.php package-lock.json\n\ngit commit -a -m \"Fortify Auth functionality added \\\nFortify features enabled and respective view names assigned\"\n\ngit push --set-upstream origin fortify-auth<\/code><\/pre>\n\n\n\n<p>En la siguiente entrada les mostrar\u00e9 como son nuestras vistas para login, registro y reset de password usando Fortify y probaremos que tal funcionan.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>17 de enero Siempre que leo las diferentes formas de autenticar con Laravel, termino yendo al que mejor entiendo, pero tambi\u00e9n uno un chiqui complicado: Fortify \u00bfPor qu\u00e9? No hay porque&#8230; Hablemos un poquito de Fortify Fortify es un sistema que se usa en el backend (tras bambalinas) de autenticaci\u00f3n agn\u00f3stico al frontend (eso significa [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[78,13,97],"tags":[104,98,99,105],"class_list":["post-272","post","type-post","status-publish","format-standard","hentry","category-howto","category-open-source","category-proyectos","tag-fortify","tag-laravel","tag-php","tag-service-providers"],"_links":{"self":[{"href":"https:\/\/ventiladorcito.com\/blog\/wp-json\/wp\/v2\/posts\/272","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ventiladorcito.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ventiladorcito.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ventiladorcito.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ventiladorcito.com\/blog\/wp-json\/wp\/v2\/comments?post=272"}],"version-history":[{"count":6,"href":"https:\/\/ventiladorcito.com\/blog\/wp-json\/wp\/v2\/posts\/272\/revisions"}],"predecessor-version":[{"id":281,"href":"https:\/\/ventiladorcito.com\/blog\/wp-json\/wp\/v2\/posts\/272\/revisions\/281"}],"wp:attachment":[{"href":"https:\/\/ventiladorcito.com\/blog\/wp-json\/wp\/v2\/media?parent=272"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ventiladorcito.com\/blog\/wp-json\/wp\/v2\/categories?post=272"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ventiladorcito.com\/blog\/wp-json\/wp\/v2\/tags?post=272"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}