import { createApp } from 'vue' import Keycloak from "keycloak-js" import VueKeycloakJs from '@dsb-norge/vue-keycloak-js' import axios, { Axios, type AxiosInstance } from 'axios' import App from '@/App.vue' export interface Resource { name: string default_resource_id: string role_required: string scope_required: string } export interface Resources { [name: string]: Resource } interface ResourceProvider { id: string name: string baseUrl: string verifySSL: boolean resources: Resources } export interface ResourceProviders { [name: string]: ResourceProvider } interface Settings { keycloakUri: string realm: string clientId: string sso: boolean resourceServerUrl: string resourceScopes: string[] authProvider: string tokenSandbox: boolean resourceProviders: ResourceProviders } interface AxiosResourceProviders { [name: string]: AxiosInstance } export let settings: Settings export let authServer: AxiosInstance export let resourceServer: AxiosInstance export let axiosResourceProviders: AxiosResourceProviders = {} // The settings.json file is expected at the server's base url axios.get("settings.json").then().then( resp => { settings = resp.data resourceServer = axios.create({ baseURL: settings.resourceServerUrl, timeout: 10000 }) authServer = axios.create({ baseURL: '/', timeout: 10000 }) app.use(VueKeycloakJs, { config: { url: settings.keycloakUri, realm: settings.realm, clientId: settings.clientId }, init: { onLoad: settings.sso ? "check-sso" : "login-required", scope: "openid email profile " + settings.resourceScopes.join(" ") }, onReady(keycloak: Keycloak) { initializeTokenInterceptor(keycloak) app.mount("#app") }, }) } ) function initializeTokenInterceptor(keycloak: Keycloak) { Object.entries(settings.resourceProviders).forEach( ([id, resourceProvider]) => { const rp = axios.create({ baseURL: resourceProvider.baseUrl, timeout: 10000 }) rp.interceptors.request.use(axiosSettings => { if (keycloak.authenticated) { axiosSettings.headers.Authorization = `Bearer ${keycloak.token}` axiosSettings.headers.auth_provider = settings.authProvider } return axiosSettings }, error => { return Promise.reject(error) }) axiosResourceProviders[id] = rp } ) authServer.interceptors.request.use(axiosSettings => { if (keycloak.authenticated) { axiosSettings.headers.Authorization = `Bearer ${keycloak.token}` axiosSettings.headers.auth_provider = settings.authProvider } return axiosSettings }, error => { return Promise.reject(error) }) resourceServer.interceptors.request.use(axiosSettings => { if (keycloak.authenticated) { axiosSettings.headers.Authorization = `Bearer ${keycloak.token}` axiosSettings.headers.auth_provider = settings.authProvider } return axiosSettings }, error => { return Promise.reject(error) }) } const app = createApp(App)