From 64b515d8494af09fef0a833b67989dcf33bd3128 Mon Sep 17 00:00:00 2001 From: Bram Wiepjes <bramw@protonmail.com> Date: Fri, 28 Jun 2019 14:42:42 +0200 Subject: [PATCH] redirect to login or app depending on if logged in --- backend/src/baserow/api/v0/jwt.py | 8 ++++++++ backend/src/baserow/config/settings/base.py | 5 +++-- web-frontend/pages/app/index.vue | 18 ++++++++++++++++++ web-frontend/pages/index.vue | 14 +++++--------- web-frontend/pages/login/index.vue | 2 +- web-frontend/store/auth.js | 11 ++++++----- 6 files changed, 41 insertions(+), 17 deletions(-) create mode 100644 backend/src/baserow/api/v0/jwt.py create mode 100644 web-frontend/pages/app/index.vue diff --git a/backend/src/baserow/api/v0/jwt.py b/backend/src/baserow/api/v0/jwt.py new file mode 100644 index 000000000..0bf7c803d --- /dev/null +++ b/backend/src/baserow/api/v0/jwt.py @@ -0,0 +1,8 @@ +from .serializers.user import UserSerializer + + +def jwt_response_payload_handler(token, user=None, request=None): + return { + 'token': token, + 'user': UserSerializer(user, context={'request': request}).data + } diff --git a/backend/src/baserow/config/settings/base.py b/backend/src/baserow/config/settings/base.py index e8ee59640..707d4e08e 100644 --- a/backend/src/baserow/config/settings/base.py +++ b/backend/src/baserow/config/settings/base.py @@ -129,7 +129,8 @@ CORS_ORIGIN_WHITELIST = ( ) JWT_AUTH = { - 'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=30), + 'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300), 'JWT_ALLOW_REFRESH': True, - 'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7) + 'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7), + 'JWT_RESPONSE_PAYLOAD_HANDLER': 'baserow.api.v0.jwt.jwt_response_payload_handler' } diff --git a/web-frontend/pages/app/index.vue b/web-frontend/pages/app/index.vue new file mode 100644 index 000000000..d0a7363c8 --- /dev/null +++ b/web-frontend/pages/app/index.vue @@ -0,0 +1,18 @@ +<template> + <div> + <h1>Welcome {{ user }}</h1> + </div> +</template> + +<script> +import { mapState } from 'vuex' + +export default { + middleware: 'authenticated', + computed: { + ...mapState({ + user: state => state.auth.user + }) + } +} +</script> diff --git a/web-frontend/pages/index.vue b/web-frontend/pages/index.vue index db76e6c69..38cd6e2e4 100644 --- a/web-frontend/pages/index.vue +++ b/web-frontend/pages/index.vue @@ -1,16 +1,12 @@ <template> - <div> - <h1>Baserow</h1> - <p>authenticated: {{ isAuthenticated }}</p> - <nuxt-link :to="{ name: 'login' }">Login</nuxt-link> - </div> + <div></div> </template> <script> -import { mapGetters } from 'vuex' - export default { - middleware: 'authenticated', - computed: { ...mapGetters({ isAuthenticated: 'auth/isAuthenticated' }) } + mounted() { + const name = this.$store.getters['auth/isAuthenticated'] ? 'app' : 'login' + this.$nuxt.$router.replace({ name: name }) + } } </script> diff --git a/web-frontend/pages/login/index.vue b/web-frontend/pages/login/index.vue index 38233fabc..a047ac15c 100644 --- a/web-frontend/pages/login/index.vue +++ b/web-frontend/pages/login/index.vue @@ -107,7 +107,7 @@ export default { password: this.credentials.password }) .then(() => { - console.log('@TODO navigate to main page') + this.$nuxt.$router.replace({ name: 'app' }) }) .catch(() => { this.invalid = true diff --git a/web-frontend/store/auth.js b/web-frontend/store/auth.js index 5d6def1d0..f612753e8 100644 --- a/web-frontend/store/auth.js +++ b/web-frontend/store/auth.js @@ -10,9 +10,10 @@ export const state = () => ({ }) export const mutations = { - SET_USER_DATA(state, token) { + SET_USER_DATA(state, { token, user }) { state.token = token - state.user = jwtDecode(token) + state.token_data = jwtDecode(token) + state.user = user }, CLEAR_USER_DATA(state) { state.token = null @@ -31,7 +32,7 @@ export const actions = { login({ commit, dispatch }, { email, password }) { return AuthService.login(email, password).then(({ data }) => { setToken(data.token, this.app.$cookies) - commit('SET_USER_DATA', data.token) + commit('SET_USER_DATA', data) dispatch('startRefreshTimeout') }) }, @@ -44,7 +45,7 @@ export const actions = { return AuthService.refresh(token) .then(({ data }) => { setToken(data.token, this.app.$cookies) - commit('SET_USER_DATA', data.token) + commit('SET_USER_DATA', data) dispatch('startRefreshTimeout') }) .catch(() => { @@ -93,6 +94,6 @@ export const getters = { */ tokenExpireSeconds(state) { const now = Math.ceil(new Date().getTime() / 1000) - return state.user.exp - now + return state.token_data.exp - now } }