From a1aa171bb1d50ab73468b64a6f54c81b1f48f93d Mon Sep 17 00:00:00 2001 From: Annika Merris Date: Sat, 10 Feb 2024 17:33:57 -0500 Subject: [PATCH] Syncing Lots Of Auth Tweaks --- bun.lockb | Bin 181040 -> 183951 bytes package.json | 1 + public/config.json | 2 +- src/main.ts | 44 +++++++++++++++++--------- src/router/index.ts | 37 +++++++++++++++++----- src/services/zitadelAuth.ts | 46 +++++++++++++++++++++++++++ src/stores/powerItems.ts | 13 +++++--- src/types/ConfigSymbols.ts | 7 +++++ src/views/Admin.vue | 22 +++++++++++++ src/views/Login.vue | 61 ++++++++++++++++++++++++++++++++++++ src/views/NoAccess.vue | 22 +++++++++++++ 11 files changed, 227 insertions(+), 28 deletions(-) create mode 100644 src/services/zitadelAuth.ts create mode 100644 src/types/ConfigSymbols.ts create mode 100644 src/views/Admin.vue create mode 100644 src/views/Login.vue create mode 100644 src/views/NoAccess.vue diff --git a/bun.lockb b/bun.lockb index 4a06b7450b91256856371eaf6c1a7a2e7623f10c..24df2e462f64d911397a85b35b043772e3a9c37f 100755 GIT binary patch delta 34305 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 { - console.log(err) - }) + app.use(router) + app.use(vuetify) + app.use(pinia) + + app.config.globalProperties.$zitadel = zitadelAuth + + // Fetch my config + axios + .get('/config.json?noCache=' + Date.now()) + .then((resp) => { + app.provide(apiBaseURL, resp.data.apiBaseURL) + + app.mount('#app') + }) + .catch((err) => { + console.log(err) + }) +}) diff --git a/src/router/index.ts b/src/router/index.ts index ad0cbae..bbdb682 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -1,3 +1,4 @@ +import zitadelAuth from '@/services/zitadelAuth' import { createRouter, createWebHistory } from 'vue-router' const router = createRouter({ @@ -9,26 +10,46 @@ const router = createRouter({ component: () => import('@/views/HomeView.vue') }, { - path: "/blessing-power", - name: "blessing-power", + path: '/blessing-power', + name: 'blessing-power', component: () => import('@/views/BlessingPowerView.vue') }, { - path: "/fellow-power", - name: "fellow-power", + path: '/fellow-power', + name: 'fellow-power', component: () => import('@/views/FellowPowerView.vue') }, { - path: "/intimacy-power", - name: "intimacy-power", + path: '/intimacy-power', + name: 'intimacy-power', component: () => import('@/views/IntimacyPowerView.vue') }, { - path: "/test", - name: "test", + path: '/test', + name: 'test', component: () => import('@/views/Test.vue') + }, + + { + path: '/login', + name: 'login', + meta: { + authName: zitadelAuth.oidcAuth.authName + }, + component: () => import('@/views/Login.vue') + }, + { + path: '/admin', + name: 'admin', + meta: { + authName: zitadelAuth.oidcAuth.authName + }, + component: () => + zitadelAuth.hasRole('admin') ? import('@/views/Admin.vue') : import('@/views/NoAccess.vue') } ] }) +zitadelAuth.oidcAuth.useRouter(router) + export default router diff --git a/src/services/zitadelAuth.ts b/src/services/zitadelAuth.ts new file mode 100644 index 0000000..f22420e --- /dev/null +++ b/src/services/zitadelAuth.ts @@ -0,0 +1,46 @@ +import {createZITADELAuth} from "@zitadel/vue"; +import {User} from "oidc-client"; + +const zitadelAuth = createZITADELAuth({ + project_resource_id: '252968011466539011', + client_id: "252968365600079875@isl", + issuer: "http://localhost:8080/", +}) + +// handle events +zitadelAuth.oidcAuth.events.addAccessTokenExpiring(function() { + // eslint-disable-next-line no-console + console.log('access token expiring') +}) + +zitadelAuth.oidcAuth.events.addAccessTokenExpired(function() { + // eslint-disable-next-line no-console + console.log('access token expired') +}) + +zitadelAuth.oidcAuth.events.addSilentRenewError(function(err: Error) { + // eslint-disable-next-line no-console + console.error('silent renew error', err) +}) + +zitadelAuth.oidcAuth.events.addUserLoaded(function(user: User) { + // eslint-disable-next-line no-console + console.log('user loaded', user) +}) + +zitadelAuth.oidcAuth.events.addUserUnloaded(function() { + // eslint-disable-next-line no-console + console.log('user unloaded') +}) + +zitadelAuth.oidcAuth.events.addUserSignedOut(function() { + // eslint-disable-next-line no-console + console.log('user signed out') +}) + +zitadelAuth.oidcAuth.events.addUserSessionChanged(function() { + // eslint-disable-next-line no-console + console.log('user session changed') +}) + +export default zitadelAuth diff --git a/src/stores/powerItems.ts b/src/stores/powerItems.ts index 35dd629..e77cc3c 100644 --- a/src/stores/powerItems.ts +++ b/src/stores/powerItems.ts @@ -4,6 +4,8 @@ import { defineStore } from 'pinia' import { computed, ref, toRaw } from 'vue' import axiosRetry from 'axios-retry' import { getCurrentInstance } from 'vue' +import { apiBaseURL as apiBaseURLKey } from '@/types/ConfigSymbols' +import { inject } from 'vue' const BLESSING = 1 const INTIMACY = 2 @@ -26,7 +28,9 @@ export const usePowerItems = defineStore('powerItems', () => { const fellowPowerItems = ref(new Map()) const intimacyPowerItems = ref(new Map()) const isLoadComplete = ref(false) - const apiBaseUrl = getCurrentInstance()?.appContext.config.globalProperties.$apiBaseUrl + const auth = getCurrentInstance()?.appContext.config.globalProperties.$zitadel + auth?.oidcAuth.mgr.getUser().then(res => console.log(res?.id_token)) + console.log(auth?.oidcAuth.accessToken) axiosRetry(axios, { retries: 3, @@ -34,8 +38,9 @@ export const usePowerItems = defineStore('powerItems', () => { }) async function fetchPowerItems() { + const apiBaseURL = inject(apiBaseURLKey) axios - .get(apiBaseUrl + '/powerItem/byType/' + BLESSING + '/asMap', noCacheConfig) + .get(apiBaseURL + '/powerItems/byType/' + BLESSING + '/asMap', noCacheConfig) .then((resp) => { const plainMap = new Map( Object.entries(JSON.parse(localStorage.getItem(BLESSING_POWER_ITEM_STORAGE) || '{}')) @@ -51,7 +56,7 @@ export const usePowerItems = defineStore('powerItems', () => { console.log(err) }) axios - .get(apiBaseUrl + '/powerItem/byType/' + FELLOW + '/asMap', noCacheConfig) + .get(apiBaseURL + '/powerItems/byType/' + FELLOW + '/asMap', noCacheConfig) .then((resp) => { const plainMap = new Map( Object.entries(JSON.parse(localStorage.getItem(FELLOW_POWER_ITEM_STORAGE) || '{}')) @@ -67,7 +72,7 @@ export const usePowerItems = defineStore('powerItems', () => { console.log(err) }) axios - .get(apiBaseUrl + '/powerItem/byType/' + INTIMACY + '/asMap', noCacheConfig) + .get(apiBaseURL + '/powerItems/byType/' + INTIMACY + '/asMap', noCacheConfig) .then((resp) => { const plainMap = new Map( Object.entries(JSON.parse(localStorage.getItem(INTIMACY_POWER_ITEM_STORAGE) || '{}')) diff --git a/src/types/ConfigSymbols.ts b/src/types/ConfigSymbols.ts new file mode 100644 index 0000000..aed3f97 --- /dev/null +++ b/src/types/ConfigSymbols.ts @@ -0,0 +1,7 @@ +import type { InjectionKey } from "vue"; + +const apiBaseURL = Symbol() as InjectionKey + +export { + apiBaseURL +} \ No newline at end of file diff --git a/src/views/Admin.vue b/src/views/Admin.vue new file mode 100644 index 0000000..52c2f7f --- /dev/null +++ b/src/views/Admin.vue @@ -0,0 +1,22 @@ + + + \ No newline at end of file diff --git a/src/views/Login.vue b/src/views/Login.vue new file mode 100644 index 0000000..b56f985 --- /dev/null +++ b/src/views/Login.vue @@ -0,0 +1,61 @@ + + + + + + diff --git a/src/views/NoAccess.vue b/src/views/NoAccess.vue new file mode 100644 index 0000000..d1c9e80 --- /dev/null +++ b/src/views/NoAccess.vue @@ -0,0 +1,22 @@ + + + \ No newline at end of file