Auth con Firebase
Curso completo de VUE de cero a Experto!
Aprende Vue.js + Firebase + Node.js + MongoDB en un curso completo! Accede aquí
Instalar Firebase
npm i firebase
Configurar boot
Crear dentro de carpeta boot un archivo llamado firebase.js
import * as firebase from "firebase/app"
import "firebase/firestore"
import "firebase/auth"
// Agregar configuración firebase:
var firebaseConfig = {
apiKey: "xxx",
authDomain: "xxx",
databaseURL: "xxx",
projectId: "xxx",
storageBucket: "xxx",
messagingSenderId: "xxx",
appId: "xxx"
}
let firebaseApp = firebase.initializeApp(firebaseConfig)
let firebaseAuth = firebaseApp.auth()
let db = firebase.firestore();
export { firebaseAuth, db }
Abrir quasar.conf.js y agregar:
boot: [
'axios',
'firebase'
],
Ruta Login
Abrir router->routes.js y agregar una nueva página:
const routes = [
{
path: '/',
component: () => import('layouts/MyLayout.vue'),
children: [
{ path: '',
component: () => import('pages/Index.vue')
},
{
path: '/auth',
component: () => import('pages/PageAuth.vue')
}
]
}
]
Página Login
<template>
<div class="q-pa-md">
<q-btn v-if="!loggedIn">LogIn</q-btn>
<q-btn v-else @click="logoutUser">Logout</q-btn>
<q-btn v-if="!loggedIn">LogUp</q-btn>
{{loggedIn}}
<form @submit.prevent="submitForm">
<q-input v-model="formData.email" label="Ingrese correo"></q-input>
<q-input v-model="formData.password" label="Ingrese password"></q-input>
<q-btn type="submit">Ingresar</q-btn>
</form>
</div>
</template>
import { mapActions, mapState } from "vuex";
export default {
data() {
return {
formData: {email: 'test@bluuweb.cl', password: '123123'}
}
},
methods:{
...mapActions('auth', ['loginUser','logoutUser']),
submitForm(){
console.log('funciona form');
this.loginUser(this.formData)
}
},
computed: {
...mapState('auth', ['loggedIn'])
}
}
Vuex
Crear archivo store-auth.js en la carpeta store
import {firebaseAuth} from 'boot/firebase'
const state = {
loggedIn: false
}
const mutations = {
setLoggedIn(state, value){
state.loggedIn = value
}
}
const actions = {
loginUser({commit}, payload){
firebaseAuth.signInWithEmailAndPassword(
payload.email, payload.password
)
.then(response => {
console.log('response', response);
})
.catch(e => {
console.log(e);
})
},
logoutUser(){
firebaseAuth.signOut()
},
handleAuthStateChange({commit, dispatch}){
firebaseAuth.onAuthStateChanged(user => {
if(user){
commit('setLoggedIn', true)
localStorage.setItem('loggedIn', true)
}else{
commit('setLoggedIn', false);
localStorage.getItem('loggedIn', false)
}
})
}
}
const getters = {
}
export default {
namespaced: true,
state,
mutations,
actions,
getters
}
Configurar modulo index.js en carpeta store
import Vue from 'vue'
import Vuex from 'vuex'
import auth from './store-auth'
Vue.use(Vuex)
export default function (/* { ssrContext } */) {
const Store = new Vuex.Store({
modules: {
auth
},
strict: process.env.DEV
})
return Store
}
Configurar App.vue
<template>
<div id="q-app">
<router-view />
</div>
</template>
<script>
import { mapActions } from "vuex";
export default {
methods:{
...mapActions('auth', ['handleAuthStateChange'])
},
mounted(){
this.handleAuthStateChange()
}
}
</script>
Rutas protegidas
Crear archivo router-auth dentro de la carpeta boot
import {firebaseAuth} from 'boot/firebase'
export default ({router}) => {
router.beforeEach((to, from, next) => {
firebaseAuth.onAuthStateChanged(user => {
if( !user && to.path !== '/auth'){
next('/auth')
}else{
// console.log(loggedIn);
next()
}
})
})
}
Modificar quasar.conf.js
boot: [
'axios',
'firebase',
'router-auth'
],