keycloak.ts 1.83 KB
import { useKeycloakStore } from '@/@core/stores/keycloakStore'
import keycloakInstance from '@/keycloak'

export default defineNuxtPlugin(async nuxtApp => {
  const keycloakStore = useKeycloakStore()

  try {
    const authenticated = await keycloakInstance.init({
      onLoad: 'check-sso',
      checkLoginIframe: true,
      checkLoginIframeInterval: 5, // seconds
    })

    keycloakStore.authenticated = authenticated

    if (authenticated) {
      keycloakStore.refresh()
      console.log('User is authenticated')

      setInterval(async () => {
        const now = Math.floor(Date.now() / 1000)
        const accessTokenExp = keycloakInstance.tokenParsed?.exp ?? 0
        const refreshTokenExp = keycloakInstance.refreshTokenParsed?.exp ?? 0

        if (refreshTokenExp <= now) {
          console.warn('Refresh token expired. Logging out...')
          await keycloakInstance.logout({ redirectUri: `${window.location.origin}/login` })

          return
        }

        // Refresh the token if the access token is close to expiring (e.g., within 60 seconds)
        if (accessTokenExp - now < 60) {
          try {
            const refreshed = await keycloakInstance.updateToken(60)
            if (refreshed) {
              console.log('Access token refreshed')
              keycloakStore.refresh() // update store data if necessary
            }
            else {
              console.log('Access token still valid, no need to refresh')
            }
          }
          catch (err) {
            console.error('Failed to refresh token', err)
            await keycloakInstance.logout({ redirectUri: `${window.location.origin}/login` })
          }
        }
      }, 10_000) // check every 10 seconds
    }
    else {
      console.log('User is not authenticated')
    }
  }
  catch (error) {
    console.error('Keycloak init error:', error)
  }
})