From 3b7c5bd260cfe0ba00090bb5d256e44ce01aad1a Mon Sep 17 00:00:00 2001
From: Martin Weise <martin.weise@tuwien.ac.at>
Date: Sun, 9 Apr 2023 21:41:16 +0200
Subject: [PATCH] WIP

- Axios interceptor
---
 fda-ui/components/DatabaseList.vue       |  4 +--
 fda-ui/nuxt.config.js                    |  2 ++
 fda-ui/package.json                      |  1 +
 fda-ui/plugins/axios.js                  | 31 +++++++++++++++---------
 fda-ui/plugins/keycloak.js               | 31 ++++++++++++++++++++++++
 fda-ui/server-middleware/update-token.js | 11 +++++++++
 fda-ui/yarn.lock                         | 15 +++++++++++-
 7 files changed, 81 insertions(+), 14 deletions(-)
 create mode 100644 fda-ui/plugins/keycloak.js
 create mode 100644 fda-ui/server-middleware/update-token.js

diff --git a/fda-ui/components/DatabaseList.vue b/fda-ui/components/DatabaseList.vue
index eed62c7875..2259d7e86c 100644
--- a/fda-ui/components/DatabaseList.vue
+++ b/fda-ui/components/DatabaseList.vue
@@ -51,7 +51,7 @@
 
 <script>
 import { formatCreators, formatUser, formatYearUTC, isResearcher } from '@/utils'
-import { listContainers, startContainer } from '@/api/container'
+import { startContainer } from '@/api/container'
 import { createDatabase } from '@/api/database'
 
 export default {
@@ -142,7 +142,7 @@ export default {
       this.createDbDialog = false
       try {
         this.loadingContainers = true
-        const res = await listContainers(this.limit)
+        const res = await this.$axios.get(`/api/container?limit=${this.limit}`)
         this.containers = res.data
         console.debug('containers', this.containers)
         this.error = false
diff --git a/fda-ui/nuxt.config.js b/fda-ui/nuxt.config.js
index f84af6fa45..82cc9deecf 100644
--- a/fda-ui/nuxt.config.js
+++ b/fda-ui/nuxt.config.js
@@ -35,6 +35,8 @@ export default {
   ],
 
   plugins: [
+    { src: '@/plugins/axios', ssr: false },
+    { src: '@/plugins/keycloak', ssr: false },
     { src: '@/plugins/toast', ssr: false },
     { src: '@/plugins/vendors', ssr: false },
     { src: '@/plugins/axios', ssr: false },
diff --git a/fda-ui/package.json b/fda-ui/package.json
index ff23e62ae9..8e4584db51 100644
--- a/fda-ui/package.json
+++ b/fda-ui/package.json
@@ -37,6 +37,7 @@
     "is-docker": "^2.2.1",
     "jose": "^4.9.2",
     "jwt-decode": "^3.1.2",
+    "keycloak-js": "^21.0.2",
     "knex": "^0.95.6",
     "lodash": "^4.17.21",
     "moment": "^2.29.1",
diff --git a/fda-ui/plugins/axios.js b/fda-ui/plugins/axios.js
index fac95697e9..7d7226e720 100644
--- a/fda-ui/plugins/axios.js
+++ b/fda-ui/plugins/axios.js
@@ -1,12 +1,21 @@
-export default function ({ $axios, redirect }) {
-  // TODO show a toast error when something goes wrong
-  // TODO console.log('axios intercepter args', arguments)
-}
+import Vue from 'vue'
+import axios from 'axios'
+import api from '../config'
+import updateToken from '../server-middleware/update-token'
 
-// export default function (item) {
-//   $axios.onError(error => {
-//     if(error.response.status === 500) {
-//       redirect('/sorry')
-//     }
-//   })
-// }
+const instance = axios.create({
+  baseURL: api,
+  timeout: 10000,
+  params: {}
+})
+
+instance.interceptors.request.use(async (config) => {
+  const token = await updateToken()
+  config.headers.common.Authorization = `Bearer ${token}`
+  return config
+}, function (error) {
+  // Do something with request error
+  return Promise.reject(error)
+})
+
+Vue.use(instance)
diff --git a/fda-ui/plugins/keycloak.js b/fda-ui/plugins/keycloak.js
new file mode 100644
index 0000000000..c6656cae9d
--- /dev/null
+++ b/fda-ui/plugins/keycloak.js
@@ -0,0 +1,31 @@
+import Vue from 'vue'
+import Keycloak from 'keycloak-js'
+import api from '../config'
+
+const initOptions = {
+  url: api + '/api/auth',
+  realm: 'dbrepo',
+  clientId: 'dbrepo-client'
+}
+
+const _keycloak = new Keycloak(initOptions)
+
+const Plugin = {
+  install: (Vue) => {
+    Vue.$keycloak = _keycloak
+  }
+}
+Plugin.install = (Vue) => {
+  Vue.$keycloak = _keycloak
+  Object.defineProperties(Vue.prototype, {
+    $keycloak: {
+      get () {
+        return _keycloak
+      }
+    }
+  })
+}
+
+Vue.use(Plugin)
+
+export default Plugin
diff --git a/fda-ui/server-middleware/update-token.js b/fda-ui/server-middleware/update-token.js
new file mode 100644
index 0000000000..0e28d3473b
--- /dev/null
+++ b/fda-ui/server-middleware/update-token.js
@@ -0,0 +1,11 @@
+import Vue from 'vue'
+
+export default async function () {
+  console.debug('loading token')
+  try {
+    await Vue.$keycloak.updateToken(70)
+    return String(Vue.$keycloak.token)
+  } catch (error) {
+    console.error('Failed to update token', error)
+  }
+}
diff --git a/fda-ui/yarn.lock b/fda-ui/yarn.lock
index bff2f60529..2234f23e7e 100644
--- a/fda-ui/yarn.lock
+++ b/fda-ui/yarn.lock
@@ -2928,7 +2928,7 @@ balanced-match@^1.0.0:
   resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
   integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
 
-base64-js@^1.0.2, base64-js@^1.3.1:
+base64-js@^1.0.2, base64-js@^1.3.1, base64-js@^1.5.1:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
   integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
@@ -7492,6 +7492,11 @@ js-cookie@^3.0.0:
   resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.1.tgz#9e39b4c6c2f56563708d7d31f6f5f21873a92414"
   integrity sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==
 
+js-sha256@^0.9.0:
+  version "0.9.0"
+  resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966"
+  integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==
+
 js-string-escape@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef"
@@ -7631,6 +7636,14 @@ jwt-decode@^3.1.2:
   resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59"
   integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==
 
+keycloak-js@^21.0.2:
+  version "21.0.2"
+  resolved "https://registry.yarnpkg.com/keycloak-js/-/keycloak-js-21.0.2.tgz#1d3c2079d3c23850df4f253a868926861c51c488"
+  integrity sha512-i05i3VBPhQ867EgjA+OYPlf8YUPiUwtrU2zv4j8tvZIdRvhJY8f+mp1ZvRJl/GMRb+XhJs9BDknyBMrIspwDkw==
+  dependencies:
+    base64-js "^1.5.1"
+    js-sha256 "^0.9.0"
+
 keyv@^3.0.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
-- 
GitLab