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
   }
 }