Skip to content

Commit

Permalink
Log out if refreshing the token fails
Browse files Browse the repository at this point in the history
  • Loading branch information
pablogadhi committed Sep 21, 2023
1 parent ac34e55 commit 35179c2
Show file tree
Hide file tree
Showing 9 changed files with 47 additions and 9 deletions.
9 changes: 7 additions & 2 deletions packages/authentication/modules/access/useLogout/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ACCESS_COOKIE_NAME } from '@baseapp-frontend/utils'
import { ACCESS_COOKIE_NAME, REFRESH_COOKIE_NAME } from '@baseapp-frontend/utils'

import { useQueryClient } from '@tanstack/react-query'
import Cookies from 'js-cookie'
Expand All @@ -7,11 +7,16 @@ import { MFA_API_KEY } from '../../../services/mfa'
import { USER_API_KEY } from '../../../services/user'
import { ILogoutOptions } from './types'

const useLogout = ({ cookieName = ACCESS_COOKIE_NAME, onLogout }: ILogoutOptions = {}) => {
const useLogout = ({
cookieName = ACCESS_COOKIE_NAME,
refreshCookieName = REFRESH_COOKIE_NAME,
onLogout,
}: ILogoutOptions = {}) => {
const queryClient = useQueryClient()

const logout = () => {
Cookies.remove(cookieName)
Cookies.remove(refreshCookieName)
queryClient.resetQueries(USER_API_KEY.getUser())
queryClient.resetQueries(MFA_API_KEY.default)
onLogout?.()
Expand Down
9 changes: 8 additions & 1 deletion packages/authentication/modules/user/useUser/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,14 @@ import { IUseSimpleTokenUser, IUseUser } from './types'

const useUser = ({ cookieName = ACCESS_COOKIE_NAME }: IUseUser = {}): IUser | null => {
const token = Cookies.get(cookieName)
return token ? decodeJWT<IUser>(token) : null
if (token) {
try {
return decodeJWT<IUser>(token)
} catch (error) {
return null
}
}
return null
}

export const useSimpleTokenUser = <TUser extends Partial<IUser>>({
Expand Down
1 change: 1 addition & 0 deletions packages/utils/constants/events.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const LOGOUT_EVENT = 'logout'
7 changes: 6 additions & 1 deletion packages/utils/functions/axios/createAxiosInstance/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@ import Cookies from 'js-cookie'

import { SERVICES_WITHOUT_TOKEN } from '../../../constants/axios'
import { ACCESS_COOKIE_NAME, REFRESH_COOKIE_NAME } from '../../../constants/cookie'
import { LOGOUT_EVENT } from '../../../constants/events'
import { TokenTypes } from '../../../constants/token'
import { IJWTResponse } from '../../../types/jwt'
import { eventEmitter } from '../../events'
import { buildQueryString } from '../../string'

const REFRESH_TOKEN_URL = '/auth/refresh'
Expand Down Expand Up @@ -75,7 +77,10 @@ export const createAxiosInstance = ({
// eslint-disable-next-line @typescript-eslint/no-use-before-define
return await refreshAccessToken(cookieName, refreshCookieName, originalRequest)
} catch (refreshError) {
return Promise.reject(refreshError)
if (eventEmitter.listenerCount(LOGOUT_EVENT)) {
eventEmitter.emit(LOGOUT_EVENT)
return Promise.resolve()
}
}
}

Expand Down
4 changes: 0 additions & 4 deletions packages/utils/functions/axios/simpleToken.ts

This file was deleted.

3 changes: 3 additions & 0 deletions packages/utils/functions/events/eventEmitter/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { EventEmitter } from 'events'

export const eventEmitter = new EventEmitter()
1 change: 1 addition & 0 deletions packages/utils/functions/events/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './eventEmitter'
18 changes: 18 additions & 0 deletions packages/utils/hooks/useEventSubscription/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { useEffect } from 'react'

import { eventEmitter } from '../../functions/events'

export const useEventSubscription = (event: string, callback: (...args: any[]) => void) => {
const unsubscribe = () => {
eventEmitter.removeListener(event, callback)
}

useEffect(() => {
eventEmitter.on(event, callback)
return unsubscribe
}, [])

Check warning on line 13 in packages/utils/hooks/useEventSubscription/index.ts

View workflow job for this annotation

GitHub Actions / Lint

React Hook useEffect has missing dependencies: 'callback', 'event', and 'unsubscribe'. Either include them or remove the dependency array

return unsubscribe
}

// export default useEventSubscription
4 changes: 3 additions & 1 deletion packages/utils/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
export * from './constants/axios'
export * from './constants/django'
export * from './constants/cookie'
export * from './constants/django'
export * from './constants/events'
export * from './constants/regex'
export * from './constants/token'
export * from './constants/yup'
Expand All @@ -12,6 +13,7 @@ export * from './functions/string'
export * from './functions/token'

export { default as useDebounce } from './hooks/useDebounce'
export * from './hooks/useEventSubscription'

export type { IDjangoPaginatedResponse, OrderingDirection } from './types/django'
export type { ValueOf } from './types/typescript'
Expand Down

0 comments on commit 35179c2

Please sign in to comment.