Content from:
- https://www.udemy.com/course/build-web-apps-with-vuejs-firebase/ (Shaun Pelling)
- https://www.udemy.com/course/vuejs-2-the-complete-guide/ (Maximilian Schwarzmüller)
Save to localStorage
localStorage.setItem('key', 'value')
[maximilian] router.js
import Vue from 'vue'
import VueRouter from 'vue-router'
import store from './store'
import WelcomePage from './components/welcome/welcome.vue'
import DashboardPage from './components/dashboard/dashboard.vue'
import SignupPage from './components/auth/signup.vue'
import SigninPage from './components/auth/signin.vue'
Vue.use(VueRouter)
const routes = [
{ path: '/', component: WelcomePage },
{ path: '/signup', component: SignupPage },
{ path: '/signin', component: SigninPage },
{
path: '/dashboard',
component: DashboardPage,
beforeEnter (to, from, next) {
if (store.state.idToken) {
next()
} else {
next('/signin')
}
}
}
]
export default new VueRouter({mode: 'history', routes})
[maximilian] App.vue tryAutoLogin
<template>
<div id="app">
<app-header />
<router-view></router-view>
</div>
</template>
<script>
import Header from './components/header/header.vue'
export default {
name: 'app',
components: {
'app-header': Header
},
created () {
this.$store.dispatch('tryAutoLogin')
}
}
</script>
[maximilian] store.js
import Vue from 'vue'
import Vuex from 'vuex'
import axios from './axios-auth'
import globalAxios from 'axios'
import router from './router'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
idToken: null,
userId: null,
user: null
},
mutations: {
authUser (state, userData) {
state.idToken = userData.token
state.userId = userData.userId
},
storeUser (state, user) {
state.user = user
},
clearAuthData (state) {
state.idToken = null
state.userId = null
}
},
actions: {
setLogoutTimer ({commit}, expirationTime) {
setTimeout(() => {
commit('clearAuthData')
}, expirationTime * 1000)
},
signup ({commit, dispatch}, authData) {
axios.post('/signupNewUser?key=AIzaSyCXlVPPWknVGhfc60mt7Jkv0Xzrho7_mwc', {
email: authData.email,
password: authData.password,
returnSecureToken: true
})
.then(res => {
console.log(res)
commit('authUser', {
token: res.data.idToken,
userId: res.data.localId
})
const now = new Date()
const expirationDate = new Date(now.getTime() + res.data.expiresIn * 1000)
localStorage.setItem('token', res.data.idToken)
localStorage.setItem('userId', res.data.localId)
localStorage.setItem('expirationDate', expirationDate)
dispatch('storeUser', authData)
dispatch('setLogoutTimer', res.data.expiresIn)
})
.catch(error => console.log(error))
},
login ({commit, dispatch}, authData) {
axios.post('/verifyPassword?key=AIzaSyCXlVPPWknVGhfc60mt7Jkv0Xzrho7_mwc', {
email: authData.email,
password: authData.password,
returnSecureToken: true
})
.then(res => {
console.log(res)
const now = new Date()
const expirationDate = new Date(now.getTime() + res.data.expiresIn * 1000)
localStorage.setItem('token', res.data.idToken)
localStorage.setItem('userId', res.data.localId)
localStorage.setItem('expirationDate', expirationDate)
commit('authUser', {
token: res.data.idToken,
userId: res.data.localId
})
dispatch('setLogoutTimer', res.data.expiresIn)
})
.catch(error => console.log(error))
},
tryAutoLogin ({commit}) {
const token = localStorage.getItem('token')
if (!token) {
return
}
const expirationDate = localStorage.getItem('expirationDate')
const now = new Date()
if (now >= expirationDate) {
return
}
const userId = localStorage.getItem('userId')
commit('authUser', {
token: token,
userId: userId
})
},
logout ({commit}) {
commit('clearAuthData')
localStorage.removeItem('expirationDate')
localStorage.removeItem('token')
localStorage.removeItem('userId')
router.replace('/signin')
},
storeUser ({commit, state}, userData) {
if (!state.idToken) {
return
}
globalAxios.post('/users.json' + '?auth=' + state.idToken, userData)
.then(res => console.log(res))
.catch(error => console.log(error))
},
fetchUser ({commit, state}) {
if (!state.idToken) {
return
}
globalAxios.get('/users.json' + '?auth=' + state.idToken)
.then(res => {
console.log(res)
const data = res.data
const users = []
for (let key in data) {
const user = data[key]
user.id = key
users.push(user)
}
console.log(users)
commit('storeUser', users[0])
})
.catch(error => console.log(error))
}
},
getters: {
user (state) {
return state.user
},
isAuthenticated (state) {
return state.idToken !== null
}
}
})
[maximilian] dashboard.vue
<template>
<div id="dashboard">
<h1>That's the dashboard!</h1>
<p>You should only get here if you're authenticated!</p>
<p v-if="email">Your email address: </p>
</div>
</template>
<script>
import axios from 'axios';
export default {
computed: {
email () {
return !this.$store.getters.user ? false : this.$store.getters.user.email
}
},
created () {
this.$store.dispatch('fetchUser')
}
}
</script>