85 lines
No EOL
2 KiB
JavaScript
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
|
|
}
|
|
} |