mod-portal-v2/app/composables/useKeycloak.js
2026-07-27 10:34:50 +02:00

85 lines
No EOL
2 KiB
JavaScript

import { ref } from 'vue'
const keycloakInstance = ref(null)
const isAuthenticated = ref(false)
const userProfile = ref(null)
const isInitialized = ref(false)
export const useKeycloak = () => {
const config = useRuntimeConfig()
const initKeycloak = async () => {
if (isInitialized.value && keycloakInstance.value?.authenticated) {
return true
}
if (!import.meta.client) return false
try {
const Keycloak = (await import('keycloak-js')).default
const keycloak = new Keycloak({
url: config.public.keycloakUrl,
realm: config.public.keycloakRealm,
clientId: config.public.keycloakClientId
})
keycloakInstance.value = keycloak
const auth = await keycloak.init({
onLoad: 'check-sso',
pkceMethod: 'S256',
responseMode: 'query',
checkLoginIframe: false
})
const loggedIn = Boolean(auth || keycloak.authenticated)
isAuthenticated.value = loggedIn
isInitialized.value = true
if (loggedIn) {
try {
userProfile.value = await keycloak.loadUserProfile()
} catch (e) {
console.warn('Could not load user profile:', e)
}
if (window.location.search.includes('code=')) {
window.history.replaceState({}, document.title, window.location.pathname)
}
}
return loggedIn
} catch (error) {
console.error('Keycloak init failed:', error)
isInitialized.value = true
isAuthenticated.value = false
return false
}
}
const login = () => {
if (keycloakInstance.value) {
keycloakInstance.value.login({
redirectUri: `${window.location.origin}/`
})
}
}
const logout = () => {
if (keycloakInstance.value) {
keycloakInstance.value.logout({
redirectUri: `${window.location.origin}/oauth`
})
}
}
return {
keycloakInstance,
isAuthenticated,
userProfile,
isInitialized,
initKeycloak,
login,
logout
}
}