1
0
Fork 0
mirror of https://gitlab.com/bramw/baserow.git synced 2025-04-30 07:10:03 +00:00

Fix bug when authentication middleware fails to renew the token

This commit is contained in:
Davide Silvestri 2022-12-01 10:15:59 +00:00
parent baa05f26bf
commit 43d02379c5
4 changed files with 30 additions and 22 deletions
web-frontend/modules/core

View file

@ -11,7 +11,6 @@ export default function ({ req, store, route, redirect }) {
if (req) { if (req) {
query.original = encodeURI(req.originalUrl) query.original = encodeURI(req.originalUrl)
} }
return redirect({ name: 'login', query }) return redirect({ name: 'login', query })
} }

View file

@ -3,18 +3,21 @@ import {
setToken, setToken,
} from '@baserow/modules/core/utils/auth' } from '@baserow/modules/core/utils/auth'
export default function ({ store, req, app, route }) { export default function ({ store, req, app, route, redirect }) {
// If nuxt generate or already authenticated, pass this middleware // If nuxt generate or already authenticated, pass this middleware
if ((process.server && !req) || store.getters['auth/isAuthenticated']) return if ((process.server && !req) || store.getters['auth/isAuthenticated']) return
// session token (if any) can be in the query param (if SSO) or in the cookies // token can be in the query string (SSO) or in the cookies (previous session)
let refreshToken = route.query.token let refreshToken = route.query.token
if (refreshToken) { if (refreshToken) {
setToken(app, refreshToken) setToken(app, refreshToken)
} else { } else {
refreshToken = getTokenIfEnoughTimeLeft(app) refreshToken = getTokenIfEnoughTimeLeft(app)
} }
if (refreshToken) { if (refreshToken) {
return store.dispatch('auth/refresh', refreshToken) return store.dispatch('auth/refresh', refreshToken).catch(() => {
return redirect({ name: 'login' })
})
} }
} }

View file

@ -414,7 +414,6 @@ export function makeErrorResponseInterceptor(
// user session expired. Redirect to login page to start a new session. // user session expired. Redirect to login page to start a new session.
if (rspData?.error === 'ERROR_INVALID_REFRESH_TOKEN') { if (rspData?.error === 'ERROR_INVALID_REFRESH_TOKEN') {
store.dispatch('auth/setUserSessionExpired', true)
nuxtErrorHandler({ statusCode: 401, message: 'User session expired' }) nuxtErrorHandler({ statusCode: 401, message: 'User session expired' })
return Promise.reject(error) return Promise.reject(error)
} }

View file

@ -147,27 +147,32 @@ export const actions = {
* new refresh timeout. If unsuccessful the existing cookie and user data is * new refresh timeout. If unsuccessful the existing cookie and user data is
* cleared. * cleared.
*/ */
async refresh({ commit, getters }, token = null) { async refresh({ commit, getters, dispatch }, token = null) {
const refreshToken = token || getters.refreshToken const refreshToken = token || getters.refreshToken
if (!refreshToken) { if (!refreshToken) {
throw new Error('Invalid refresh token') throw new Error('Invalid refresh token')
} }
const tokenUpdatedAt = new Date().getTime() try {
const rsp = await AuthService(this.$client).refresh(refreshToken) const tokenUpdatedAt = new Date().getTime()
if (!rsp) { const { data } = await AuthService(this.$client).refresh(refreshToken)
return // invalid refresh token // if ROTATE_REFRESH_TOKEN=False in the backend the response will not contain
} // a new refresh token. In that case, we keep the one we just used.
commit('SET_USER_DATA', {
// if ROTATE_REFRESH_TOKEN=False in the backend the response will not contain refresh_token: refreshToken,
// a new refresh token. In that case we keep the old originally one stored in the cookie. tokenUpdatedAt,
commit('SET_USER_DATA', { ...data,
refresh_token: refreshToken, })
tokenUpdatedAt, if (!getters.getPreventSetToken && data.refresh_token) {
...rsp.data, setToken(this.app, getters.refreshToken)
}) }
if (!getters.getPreventSetToken && rsp.data.refresh_token) { } catch (error) {
setToken(this.app, getters.refreshToken) unsetToken(this.app)
unsetGroupCookie(this.app)
if (getters.isAuthenticated) {
dispatch('setUserSessionExpired', true)
}
throw error
} }
}, },
/** /**
@ -209,6 +214,8 @@ export const actions = {
commit('SET_PREVENT_SET_TOKEN', true) commit('SET_PREVENT_SET_TOKEN', true)
}, },
setUserSessionExpired({ commit }, value) { setUserSessionExpired({ commit }, value) {
unsetToken(this.app)
unsetGroupCookie(this.app)
commit('SET_USER_SESSION_EXPIRED', value) commit('SET_USER_SESSION_EXPIRED', value)
}, },
} }
@ -265,7 +272,7 @@ export const getters = {
return state.preventSetToken return state.preventSetToken
}, },
isUserSessionExpired: (state) => { isUserSessionExpired: (state) => {
return state.authenticated && state.userSessionExpired return state.userSessionExpired
}, },
} }