{"id":231914,"date":"2023-01-11T10:20:00","date_gmt":"2023-01-11T07:20:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=231914"},"modified":"2022-11-10T05:42:11","modified_gmt":"2022-11-10T02:42:11","slug":"como-crear-un-inicio-de-sesion-en-firebase-y-registrarse-en-react","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/como-crear-un-inicio-de-sesion-en-firebase-y-registrarse-en-react\/","title":{"rendered":"C\u00f3mo crear un inicio de sesi\u00f3n en Firebase y registrarse en React"},"content":{"rendered":"\n<p>Firebase es un sistema que ofrece muchas plataformas para que los desarrolladores creen aplicaciones web. Uno de los elementos esenciales en una aplicaci\u00f3n es crear usuarios y permitirles iniciar sesi\u00f3n. Veamos c\u00f3mo podemos escribir un inicio de sesi\u00f3n de Firebase que sea completo pero muy simple de implementar.<\/p>\n<h2>Crea tu aplicaci\u00f3n Firebase<\/h2>\n<p>Primero debe crear un proyecto de aplicaci\u00f3n de Firebase, as\u00ed que dir\u00edjase a la consola de Firebase y agregue un nuevo proyecto. Agregar\u00e1 la aplicaci\u00f3n aqu\u00ed.<\/p>\n<p><a href=\"https:\/\/console.firebase.google.com\/u\/0\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/console.firebase.google.com\/<\/a><\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6bffde950b.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6bffde950b.png\" alt=\"C\u00f3mo crear un inicio de sesi\u00f3n en Firebase y registrarse en React\" ><\/a><\/p>\n<p>Lanzar\u00e1 un asistente que te preguntar\u00e1 el nombre del proyecto.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6bfffb1eed.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6bfffb1eed.png\" alt=\"C\u00f3mo crear un inicio de sesi\u00f3n en Firebase y registrarse en React\" ><\/a><\/p>\n<p>La siguiente pantalla le preguntar\u00e1 si desea habilitar el an\u00e1lisis. Desact\u00edvelo y haga clic en el bot\u00f3n <strong>Crear proyecto<\/strong>. Tomar\u00e1 un tiempo aprovisionar su proyecto y luego obtendr\u00e1 un bot\u00f3n para <strong>Continuar<\/strong> que lo llevar\u00e1 a la descripci\u00f3n general del proyecto.<\/p>\n<p>Ahora debe agregar una aplicaci\u00f3n de Firebase al proyecto de Firebase. \u00bfTiene sentido? Un proyecto de Firebase le permite contener varias aplicaciones de Firebase para iOS, Android, Web y Unity. Por ahora, creemos una aplicaci\u00f3n web ya que usaremos React para crear nuestro inicio de sesi\u00f3n de Firebase.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6c001c1120.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6c001c1120.png\" alt=\"C\u00f3mo crear un inicio de sesi\u00f3n en Firebase y registrarse en React\" ><\/a><\/p>\n<p>Se le pedir\u00e1 que asigne un nombre a esta aplicaci\u00f3n y se le dar\u00e1n las claves que deber\u00e1 usar para conectarse con Firebase. Se ver\u00e1n algo como:<\/p>\n<pre><code>var firebaseConfig = {\n    apiKey: \"1A2B3C4D5E6F7G\",\n    authDomain: \"appname-a123b.firebaseapp.com\",\n    databaseURL: \"https:\/\/appname-a123b.firebaseio.com\",\n    projectId: \"appname-a123b\",\n    storageBucket: \"appname-a123b.appspot.com\",\n    messagingSenderId: \"1234567890\",\n};<\/code><\/pre>\n<p>Usaremos estas claves en nuestra aplicaci\u00f3n <a href=\"https:\/\/startfunction.com\/tag\/react\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React<\/a> para configurar un proveedor que nos permitir\u00e1 acceder a Firebase en cualquier componente del proveedor.<\/p>\n<p>Finalmente, vaya a <strong>Autenticaci\u00f3n<\/strong> en la barra lateral izquierda, la pesta\u00f1a <strong>M\u00e9todo de inicio de sesi\u00f3n<\/strong> y habilite la autenticaci\u00f3n de <strong>correo electr\u00f3nico\/contrase\u00f1a .<\/strong><\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6c00385c64.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6c00385c64.png\" alt=\"C\u00f3mo crear un inicio de sesi\u00f3n en Firebase y registrarse en React\" ><\/a><\/p>\n<p>\u00a1Est\u00e1s listo!<\/p>\n<h2>Instalar dependencias de Firebase<\/h2>\n<p>Firebase est\u00e1 disponible para diferentes pilas, incluidas <a href=\"https:\/\/startfunction.com\/category\/javascript\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">JavaScript<\/a> y <a href=\"https:\/\/startfunction.com\/tag\/node-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Node.js<\/a>, que es lo que vamos a usar ahora. Vamos a instalar solo dos dependencias con npm:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.npmjs.com\/package\/firebase\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\"><code>firebase<\/code><\/a>, que nos permitir\u00e1 acceder a cosas como la <code>auth<\/code>biblioteca, que usaremos para realizar el inicio de sesi\u00f3n y tambi\u00e9n crear un nuevo usuario<\/li>\n<li><a href=\"https:\/\/www.npmjs.com\/package\/reactfire\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\"><code>reactfire<\/code><\/a>, una colecci\u00f3n de herramientas \u00fatiles para trabajar con Firebase en React. Los usaremos <code>useFirebaseApp<\/code>para conectarnos al contexto y acceder a Firebase.<\/li>\n<\/ul>\n<p>Vamos a instalarlos con<\/p>\n<pre><code>npm i firebase reactfire<\/code><\/pre>\n<p>La estructura de la aplicaci\u00f3n <a href=\"https:\/\/startfunction.com\/tag\/react\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React<\/a> ser\u00e1 muy simple, de la siguiente manera:<\/p>\n<pre><code>|-- index.js\n|-- App.js\n|-- FirebaseUser\n    |-- index.js<\/code><\/pre>\n<p>y estar\u00e1n relacionados de la siguiente manera:<\/p>\n<pre><code>index.js --import--&gt; .\/App.js --import--&gt; .\/FirebaseUser<\/code><\/pre>\n<h2>Configurar el proveedor de Firebase<\/h2>\n<p>\u00a1Escribamos el primer archivo para el inicio de sesi\u00f3n y el registro de Firebase! En realidad, no necesitamos escribirlo, porque esto debe agregarse al archivo donde est\u00e1 emitiendo <code>ReactDOM.render()<\/code>, en nuestro caso ser\u00e1 <code>index.js<\/code>:<\/p>\n<pre><code>import { FirebaseAppProvider } from 'reactfire';\n\nconst firebaseConfig = {\n    apiKey: \"1A2B3C4D5E6F7G\",\n    authDomain: \"appname-a123b.firebaseapp.com\",\n    databaseURL: \"https:\/\/appname-a123b.firebaseio.com\",\n    projectId: \"appname-a123b\",\n    storageBucket: \"appname-a123b.appspot.com\",\n    messagingSenderId: \"925199572988\",\n    appId: \"1:123456789:web:12a34b56c78d90e\"\n};<\/code><\/pre>\n<p>Esto importa <code>FirebaseAppProvider<\/code>y agrega las claves de configuraci\u00f3n que le pasar\u00e1s. Ahora puede envolver el componente ra\u00edz, que en nuestro caso es <code>App<\/code>con el proveedor:<\/p>\n<pre><code>ReactDOM.render(, document.getElementById('root')\n);<\/code><\/pre>\n<p>\u00a1Excelente! \u00a1Ahora todos los componentes a continuaci\u00f3n podr\u00e1n acceder a Firebase!<\/p>\n<h2>Use el componente de inicio de sesi\u00f3n y registro de Firebase<\/h2>\n<p>Escribamos ahora el <code>App<\/code>componente donde importaremos y usaremos el <code>FirebaseUser<\/code>componente para crear e iniciar sesi\u00f3n en un usuario. No hay nada realmente relacionado con <a href=\"https:\/\/startfunction.com\/tag\/firebase\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Firebase<\/a> aqu\u00ed. Vamos a implementar un inicio de sesi\u00f3n y registro usando el mismo componente para que pueda ver c\u00f3mo podemos reutilizar el c\u00f3digo, por lo que en este componente implementaremos un par de botones que, al hacer clic, mostrar\u00e1n el <code>FirebaseUser<\/code>modo de inicio de sesi\u00f3n o un modo de registro:<\/p>\n<pre><code>import React, { useState } from 'react';\nimport FirebaseUser from '.\/FirebaseUser';\n\nfunction App() {\n  const [ signInOrUp, setSignInOrUp ] = useState( '' );\n  return (Firebase login\n      {\n        signInOrUp?(): (&lt;&gt;\n             setSignInOrUp( 'signin') } &gt;Log in with existing user\n             setSignInOrUp( 'signup') } &gt;Create a new user) }\n\n  );\n}\n\nexport default App;\n<\/code><\/pre>\n<h2>Configure el inicio de sesi\u00f3n de Firebase y reg\u00edstrese<\/h2>\n<p>Crearemos un componente para esto. Primero necesitamos importar algunos m\u00f3dulos:<\/p>\n<pre><code>import React, { useState } from 'react';\nimport { useFirebaseApp } from 'reactfire';\nimport 'firebase\/auth';<\/code><\/pre>\n<p>Veremos <code>useState<\/code>algunas cosas, desde saber si el usuario est\u00e1 autenticado hasta establecer errores. Vamos a usar el <code>useFirebaseApp<\/code>gancho para acceder a la conexi\u00f3n de Firebase. Esto solo es posible porque configuramos el proveedor de Firebase en el paso anterior y solo est\u00e1 disponible en la jerarqu\u00eda donde se agreg\u00f3. Finalmente, importaremos la <code>auth<\/code>biblioteca para que podamos llamar a los m\u00e9todos de Firebase para crear usuarios e iniciar sesi\u00f3n. Esta es una forma eficiente porque solo estamos cargando esta biblioteca, y no otras como <code>firestore<\/code>para la base de datos NoSQL o <code>messaging<\/code>para mensajes y notificaciones.<\/p>\n<p>A continuaci\u00f3n, agregaremos un gancho r\u00e1pido para administrar nuestros campos de entrada:<\/p>\n<pre><code>const useField =() =&gt; {\n    const [ value, setValue ] = useState( '' );\n    return { value, onChange: x =&gt; setValue( 'string' === typeof x? x: x.target.value) };\n};<\/code><\/pre>\n<p>Y, por \u00faltimo, el componente completo, que desglosaremos a continuaci\u00f3n para se\u00f1alar las partes m\u00e1s interesantes, las relacionadas con el inicio de sesi\u00f3n y el registro de Firebase.<\/p>\n<pre><code>function FirebaseUser ({ action = 'signin' }) {\n    const email = useField();\n    const password = useField();\n    const [ auth, setAuth ] = useState( null );\n    const [ error, setError ] = useState( '' );\n    const firebase = useFirebaseApp();\n    const setReceivedData = data =&gt; setAuth( data );\n    const setReceivedError = error =&gt; setError( error.message );\n\n    const signIn = e =&gt; {\n        e.preventDefault();\n        setError( '' );\n        firebase.auth()\n            .signInWithEmailAndPassword( email.value, password.value) .then( setReceivedData) .catch( setReceivedError );\n    };\n\n    const signUp = e =&gt; {\n        e.preventDefault();\n        setError( '' );\n        firebase.auth()\n            .createUserWithEmailAndPassword( email.value, password.value) .then( setReceivedData) .catch( setReceivedError );\n    };\n\n    const manage = 'signin' === action? {\n            success: `Logged in as ${ auth?.user.email ?? '' }`,\n            method: signIn,\n            label: 'Sign In'\n        }: {\n            success: `Signed up as ${ auth?.user.email ?? '' }`,\n            method: signUp,\n            label: 'Sign Up'\n        };\n\n    return ({\n                auth? ({ manage.success }\n                ): (&lt;&gt;\n\n                            { manage.label }\n                            {\n                                error &amp;&amp; { error }\n                            }) }\n\n    );\n}\n\nexport default FirebaseUser;\n<\/code><\/pre>\n<p>Primero, nos conectamos a la instancia de Firebase:<\/p>\n<pre><code>const firebase = useFirebaseApp();<\/code><\/pre>\n<p>Como se se\u00f1al\u00f3 anteriormente, esto es posible porque previamente empaquetamos el <code>App<\/code>componente con el proveedor de Firebase. Ahora que estamos conectados a Firebase, podemos usar la <code>auth<\/code>funcionalidad y llamar a <code>signInWithEmailAndPassword<\/code>:<\/p>\n<pre><code>const signIn = e =&gt; {\n        e.preventDefault();\n        setError( '' );\n        firebase.auth()\n            .signInWithEmailAndPassword( email.value, password.value) .then( setReceivedData) .catch( setReceivedError );\n};<\/code><\/pre>\n<p>Cuando tenga \u00e9xito, establecer\u00e1 los datos devueltos y los campos del formulario se reemplazar\u00e1n con<\/p>\n<pre><code>Logged in as ${ auth?.user.email ?? '' }<\/code><\/pre>\n<p>Los datos devueltos son un objeto grande con propiedades muy interesantes, por lo que vale la pena agregar <code>console.log()<\/code>a nuestra <code>setReceivedData()<\/code>funci\u00f3n para ver qu\u00e9 m\u00e1s incluye.<\/p>\n<p>El proceso para crear un usuario es similar, excepto que usamos la funci\u00f3n <code>createUserWithEmailAndPassword()<\/code>.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>Para probar nuestro inicio de sesi\u00f3n de Firebase y registrarse, puede intentar iniciar sesi\u00f3n con un usuario que no existe para que pueda ver los errores. Despu\u00e9s de eso, cree un usuario y luego inicie sesi\u00f3n como usuario.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6c00594d08.gif\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6c00594d08.gif\" alt=\"C\u00f3mo crear un inicio de sesi\u00f3n en Firebase y registrarse en React\" ><\/a><\/p>\n<p>Demostraci\u00f3n del inicio de sesi\u00f3n y registro de Firebase.<br \/>\nDato curioso: Chrome se queja de que la contrase\u00f1a 123456 que estoy usando para las pruebas est\u00e1 comprometida, lo cual es cierto.<\/p>\n<p>Si ahora regresa a la aplicaci\u00f3n Firebase &gt; Autenticaci\u00f3n &gt; Usuarios, ver\u00e1 el nuevo usuario (es posible que deba usar el bot\u00f3n Actualizar junto a Agregar usuario).<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6c007b1816.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6c007b1816.png\" alt=\"C\u00f3mo crear un inicio de sesi\u00f3n en Firebase y registrarse en React\" ><\/a><\/p>\n<p>En resumen, los pasos esenciales para integrar Firebase en nuestra aplicaci\u00f3n React son:<\/p>\n<ul>\n<li>configure el proveedor de Firebase y envuelva el componente ra\u00edz (o la ra\u00edz de la jerarqu\u00eda donde desea usarlo)<\/li>\n<li>enganche al proveedor de Firebase usando<code>useFirebaseApp<\/code><\/li>\n<li>\u00a1utilice las funciones de autenticaci\u00f3n!<\/li>\n<\/ul>\n<p>Consulte el repositorio de GitHub en <a href=\"https:\/\/github.com\/eliorivero\/firebase-login-sign-up\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/github.com\/eliorivero\/firebase-login-sign-up<\/a>. La \u00fanica diferencia con este es que estoy cargando las claves para configurar Firebase desde un archivo .env para evitar exponerlas p\u00fablicamente.<\/p>\n<p>Si tiene alguna pregunta, h\u00e1gamelo saber en los comentarios a continuaci\u00f3n.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/startfunction.com\" class=\"external external_icon\">startfunction.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Aprenda a crear un sistema de inicio de sesi\u00f3n y registro de Firebase en React usando ganchos.<\/p>\n","protected":false},"author":1,"featured_media":157702,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,716,747,831,779,840],"tags":[1172],"class_list":["post-231914","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-fuente-abierta","category-guia-para-principiantes","category-software-de-codigo-abierto","category-tutoriales","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231914","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=231914"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/231914\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/157702"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=231914"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=231914"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=231914"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}