From 20dc7ef88adc2b2638de11496141cec7adc98bbd Mon Sep 17 00:00:00 2001
From: Yasin Ali Marouga <yasinam@stud.ntnu.no>
Date: Mon, 29 Apr 2024 09:20:09 +0200
Subject: [PATCH 1/8] chore: skeleton for biometric login

---
 src/components/FormLogin.vue      |   5 ++
 src/router/index.ts               |   5 ++
 src/stores/userStore.ts           | 111 ++++++++++++++++++++++++++++++
 src/types/CredentialCreateJson.ts |   0
 src/types/CredentialGetJson.ts    |   3 +
 src/util.ts                       |  30 ++++++++
 src/utilo.js                      |  24 +++++++
 src/views/BioAuthLogin.vue        |  99 ++++++++++++++++++++++++++
 src/views/RegisterLoginView.vue   |   2 +
 9 files changed, 279 insertions(+)
 create mode 100644 src/types/CredentialCreateJson.ts
 create mode 100644 src/types/CredentialGetJson.ts
 create mode 100644 src/util.ts
 create mode 100644 src/utilo.js
 create mode 100644 src/views/BioAuthLogin.vue

diff --git a/src/components/FormLogin.vue b/src/components/FormLogin.vue
index 731e224..3dcca63 100644
--- a/src/components/FormLogin.vue
+++ b/src/components/FormLogin.vue
@@ -20,6 +20,10 @@ const submitForm = () => {
     userStore.login(username.value, password.value)
 }
 
+const bioLogin = () => {
+    userStore.bioLogin(username.value)
+}
+
 const toggleShowPassword = () => {
     showPassword.value = !showPassword.value
 }
@@ -95,6 +99,7 @@ watch(
                 Logg inn
             </button>
             <p>{{ errorMessage }}</p>
+            <button @click="bioLogin">biologin</button>
         </div>
     </div>
     <modal-component
diff --git a/src/router/index.ts b/src/router/index.ts
index 4ae0e9a..6247cd4 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -112,6 +112,11 @@ const router = createRouter({
             path: '/:pathMatch(.*)*',
             name: 'not-found',
             component: () => import('@/views/NotFoundView.vue')
+        },
+        {
+            path: '/bioAuthLogin',
+            name: 'bioAuthLogin',
+            component: () => import('@/views/BioAuthLogin.vue')
         }
     ],
     scrollBehavior() {
diff --git a/src/stores/userStore.ts b/src/stores/userStore.ts
index fe31bd1..9838aed 100644
--- a/src/stores/userStore.ts
+++ b/src/stores/userStore.ts
@@ -4,6 +4,9 @@ import type { User } from '@/types/user'
 import router from '@/router'
 import type { AxiosError } from 'axios'
 import axios from 'axios'
+import type { CredentialGetJson } from '@/types/CredentialGetJson'
+import { base64urlToUint8array, initialCheckStatus, uint8arrayToBase64url } from '@/util'
+import authInterceptor from '@/services/authInterceptor'
 
 export const useUserStore = defineStore('user', () => {
     const defaultUser: User = {
@@ -76,10 +79,118 @@ export const useUserStore = defineStore('user', () => {
         router.push({ name: 'login' })
     }
 
+    //const registerPasskey = async () => {
+    //    await authInterceptor
+    //        .post("/auth/bioRegistration")
+    //        .then(response => {
+    //            initialCheckStatus(response)
+    //            return response.data
+    //        })
+    //        .then(credentialCreateJson => ({
+    //            publicKey: {
+    //                ...credentialCreateJson.publicKey,
+    //                challenge: base64urlToUint8array(credentialCreateJson.publicKey.challenge),
+    //                user: {
+    //                    ...credentialCreateJson.publicKey.user,
+    //                    id: base64urlToUint8array(credentialCreateJson.publicKey.user.id),
+    //                },
+    //                excludeCredentials: credentialCreateJson.publicKey.excludeCredentials.map(credential => ({
+    //                    ...credential,
+    //                    id: base64urlToUint8array(credential.id),
+    //                })),
+    //                extensions: credentialCreateJson.publicKey.extensions,
+    //            },
+    //        }))
+    //        .then(credentialCreateOptions => {
+    //            return navigator.credentials.create(credentialCreateOptions)
+    //        })
+    //        .then(publicKeyCredential => ({
+    //            type: publicKeyCredential.type,
+    //            id: publicKeyCredential.id,
+    //            response: {
+    //                attestationObject: uint8arrayToBase64url(publicKeyCredential.response.attestationObject),
+    //                clientDataJSON: uint8arrayToBase64url(publicKeyCredential.response.clientDataJSON),
+    //                transports: publicKeyCredential.response.getTransports && publicKeyCredential.response.getTransports() || [],
+    //            },
+    //            clientExtensionResults: publicKeyCredential.getClientExtensionResults(),
+    //        }))
+    //        .then((encodedResult) =>
+    //            authInterceptor.post("/auth/finishBioRegistration", { credential: JSON.stringify(encodedResult) }
+    //            ))
+    //        .catch((error) =>
+    //            console.log(error)
+    //        );
+    //}
+
+    const bioLogin = async (username: string) => {
+        try {
+            const request = await axios.post(`http://localhost:8080/auth/bioLogin/${username}`);
+
+            initialCheckStatus(request);
+            console.log(request)
+
+            const credentialGetJson: CredentialGetJson = request.data;
+            console.log(credentialGetJson)
+
+            const credentialGetOptions: CredentialRequestOptions = {
+                publicKey: {
+                    ...credentialGetJson.publicKey,
+                    allowCredentials: credentialGetJson.publicKey.allowCredentials
+                        && credentialGetJson.publicKey.allowCredentials.map(credential => ({
+                            ...credential,
+                            id: base64urlToUint8array(credential.id as unknown as string),
+                        })),
+                    challenge: base64urlToUint8array(credentialGetJson.publicKey.challenge as unknown as string),
+                    extensions: credentialGetJson.publicKey.extensions,
+                },
+            };
+
+            const publicKeyCredential = await navigator.credentials.get(credentialGetOptions) as PublicKeyCredential;
+
+            // Extract response data based on the type of credential
+            const response = publicKeyCredential.response as AuthenticatorAssertionResponse;
+
+            const encodedResult = {
+                type: publicKeyCredential.type,
+                id: publicKeyCredential.id,
+                response: {
+                    authenticatorData: response.authenticatorData && uint8arrayToBase64url(response.authenticatorData),
+                    clientDataJSON: response.clientDataJSON && uint8arrayToBase64url(response.clientDataJSON),
+
+                    signature: response.signature && uint8arrayToBase64url(response.signature),
+                    userHandle: response.userHandle && uint8arrayToBase64url(response.userHandle),
+                },
+                clientExtensionResults: publicKeyCredential.getClientExtensionResults(),
+            };
+            console.log(encodedResult);
+
+            await axios.post("http://localhost:8080/auth/finishBioLogin/katanta1", {
+                credential: JSON.stringify(encodedResult)
+            }).then((response) => {
+                sessionStorage.setItem('accessToken', response.data.accessToken)
+                localStorage.setItem('refreshToken', response.data.refreshToken)
+
+                user.value.firstname = response.data.firstName
+                user.value.lastname = response.data.lastName
+                user.value.username = response.data.username
+
+                router.push({ name: 'home' })
+            }).catch((error) => {
+                const axiosError = error as AxiosError
+                errorMessage.value = (axiosError.response?.data as string) || 'An error occurred'
+                console.log("hei :" + errorMessage.value)
+            })
+        } catch (error) {
+            // Handle errors
+            console.log(error);
+        }
+    }
+
     return {
         register,
         login,
         logout,
+        bioLogin,
         errorMessage
     }
 })
diff --git a/src/types/CredentialCreateJson.ts b/src/types/CredentialCreateJson.ts
new file mode 100644
index 0000000..e69de29
diff --git a/src/types/CredentialGetJson.ts b/src/types/CredentialGetJson.ts
new file mode 100644
index 0000000..027be9d
--- /dev/null
+++ b/src/types/CredentialGetJson.ts
@@ -0,0 +1,3 @@
+export interface CredentialGetJson {
+        publicKey: PublicKeyCredentialRequestOptions;
+}
diff --git a/src/util.ts b/src/util.ts
new file mode 100644
index 0000000..6c23fdb
--- /dev/null
+++ b/src/util.ts
@@ -0,0 +1,30 @@
+import base64js from 'base64-js';
+import  { type AxiosResponse } from 'axios'
+
+export function base64urlToUint8array(base64Bytes: string): Uint8Array {
+    const padding = '===='.substring(0, (4 - (base64Bytes.length % 4)) % 4);
+    return base64js.toByteArray((base64Bytes + padding).replace(/\//g, "_").replace(/\+/g, "-"));
+}
+
+
+export function uint8arrayToBase64url(bytes: Uint8Array | ArrayBuffer | number[]): string {
+    if (bytes instanceof Uint8Array) {
+        return base64js.fromByteArray(bytes).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
+    } else {
+        return uint8arrayToBase64url(new Uint8Array(bytes));
+    }
+}
+
+export function checkStatus(response: AxiosResponse<any>): AxiosResponse<any> | undefined {
+    if (response.status !== 200) {
+        console.log("an error occurred: ", response.statusText);
+        return undefined;
+    } else {
+        return response;
+    }
+}
+
+export function initialCheckStatus(response: AxiosResponse<any>): any {
+    checkStatus(response);
+    return response.data;
+}
diff --git a/src/utilo.js b/src/utilo.js
new file mode 100644
index 0000000..5cbf790
--- /dev/null
+++ b/src/utilo.js
@@ -0,0 +1,24 @@
+import base64js from 'base64-js';
+
+export function base64urlToUint8array(base64Bytes) {
+    const padding = '===='.substring(0, (4 - (base64Bytes.length % 4)) % 4);
+    return base64js.toByteArray((base64Bytes + padding).replace(/\//g, "_").replace(/\+/g, "-"));
+}
+export function uint8arrayToBase64url(bytes) {
+    if (bytes instanceof Uint8Array) {
+        return base64js.fromByteArray(bytes).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
+    } else {
+        return uint8arrayToBase64url(new Uint8Array(bytes));
+    }
+}
+export function checkStatus(response) {
+    if (response.status !== 200) {
+        console.log("an error occurred: ", response.body);
+    } else {
+        return response;
+    }
+}
+export function initialCheckStatus(response) {
+    checkStatus(response);
+    return response.data;
+}
\ No newline at end of file
diff --git a/src/views/BioAuthLogin.vue b/src/views/BioAuthLogin.vue
new file mode 100644
index 0000000..83c49a1
--- /dev/null
+++ b/src/views/BioAuthLogin.vue
@@ -0,0 +1,99 @@
+<template>
+    <button @click="testSignUp">Signup</button>
+    <button @click="testLogin">Login</button>
+</template>
+
+<script setup>
+import axios from 'axios'
+import { base64urlToUint8array, initialCheckStatus, uint8arrayToBase64url } from '@/utilo.js'
+import authInterceptor from '@/services/authInterceptor'
+
+const testSignUp = async () => {
+    await authInterceptor
+        .post("/auth/bioRegistration")
+        .then(response => {
+            initialCheckStatus(response)
+            return response.data
+        })
+        .then(credentialCreateJson => ({
+            publicKey: {
+                ...credentialCreateJson.publicKey,
+                challenge: base64urlToUint8array(credentialCreateJson.publicKey.challenge),
+                user: {
+                    ...credentialCreateJson.publicKey.user,
+                    id: base64urlToUint8array(credentialCreateJson.publicKey.user.id),
+                },
+                excludeCredentials: credentialCreateJson.publicKey.excludeCredentials.map(credential => ({
+                    ...credential,
+                    id: base64urlToUint8array(credential.id),
+                })),
+                extensions: credentialCreateJson.publicKey.extensions,
+            },
+        }))
+        .then(credentialCreateOptions => {
+            return navigator.credentials.create(credentialCreateOptions)
+        })
+        .then(publicKeyCredential => ({
+            type: publicKeyCredential.type,
+            id: publicKeyCredential.id,
+            response: {
+                attestationObject: uint8arrayToBase64url(publicKeyCredential.response.attestationObject),
+                clientDataJSON: uint8arrayToBase64url(publicKeyCredential.response.clientDataJSON),
+                transports: publicKeyCredential.response.getTransports && publicKeyCredential.response.getTransports() || [],
+            },
+            clientExtensionResults: publicKeyCredential.getClientExtensionResults(),
+        }))
+        .then((encodedResult) =>
+            authInterceptor.post("/auth/finishBioRegistration", { credential: JSON.stringify(encodedResult) }
+        ))
+        .catch((error) =>
+            console.log(error)
+        );
+}
+
+
+const testLogin = async () => {
+    await axios.post("http://localhost:8080/auth/bioLogin/katanta1")
+        // Collect from login form
+        .then(response => {
+            initialCheckStatus(response)
+            return response.data
+        })
+        .then(credentialGetJson => {
+            console.log(credentialGetJson);
+            return {
+                publicKey: {
+                    ...credentialGetJson.publicKey,
+                    allowCredentials: credentialGetJson.publicKey.allowCredentials
+                        && credentialGetJson.publicKey.allowCredentials.map(credential => ({
+                            ...credential,
+                            id: base64urlToUint8array(credential.id),
+                        })),
+                    challenge: base64urlToUint8array(credentialGetJson.publicKey.challenge),
+                    extensions: credentialGetJson.publicKey.extensions,
+                },
+            };
+        })
+        .then(credentialGetOptions => {
+            return navigator.credentials.get(credentialGetOptions)
+        })
+        .then(publicKeyCredential => ({
+            type: publicKeyCredential.type,
+            id: publicKeyCredential.id,
+            response: {
+                authenticatorData: uint8arrayToBase64url(publicKeyCredential.response.authenticatorData),
+                clientDataJSON: uint8arrayToBase64url(publicKeyCredential.response.clientDataJSON),
+                signature: uint8arrayToBase64url(publicKeyCredential.response.signature),
+                userHandle: publicKeyCredential.response.userHandle && uint8arrayToBase64url(publicKeyCredential.response.userHandle),
+            },
+            clientExtensionResults: publicKeyCredential.getClientExtensionResults(),
+        }))
+        .then((encodedResult) => {
+            console.log(encodedResult)
+            axios.post("http://localhost:8080/auth/finishBioLogin/katanta1", {
+                    credential: JSON.stringify(encodedResult)
+            })
+        })
+        .catch(error => console.log(error))
+}
+</script>
diff --git a/src/views/RegisterLoginView.vue b/src/views/RegisterLoginView.vue
index 738002a..8346f4b 100644
--- a/src/views/RegisterLoginView.vue
+++ b/src/views/RegisterLoginView.vue
@@ -4,6 +4,7 @@ import FormRegister from '@/components/FormRegister.vue'
 import { onMounted, ref } from 'vue'
 import { useRouter } from 'vue-router'
 
+
 const router = useRouter()
 
 const isLogin = ref<boolean>(true)
@@ -46,6 +47,7 @@ onMounted(() => {
             <FormLogin v-if="isLogin" />
             <FormRegister v-else />
         </div>
+
     </div>
 </template>
 
-- 
GitLab


From 375ddddf39405e4e9fd9cfbbc38c808cac39ce1b Mon Sep 17 00:00:00 2001
From: Yasin Ali Marouga <yasinam@stud.ntnu.no>
Date: Mon, 29 Apr 2024 09:57:43 +0200
Subject: [PATCH 2/8] chore: convert to ts

---
 src/stores/userStore.ts                       | 89 ++++++++++---------
 src/types/CredentialCreateJson.ts             |  0
 src/types/CredentialCreationOptions.ts        |  3 +
 ...GetJson.ts => CredentialRequestOptions.ts} |  2 +-
 4 files changed, 49 insertions(+), 45 deletions(-)
 delete mode 100644 src/types/CredentialCreateJson.ts
 create mode 100644 src/types/CredentialCreationOptions.ts
 rename src/types/{CredentialGetJson.ts => CredentialRequestOptions.ts} (56%)

diff --git a/src/stores/userStore.ts b/src/stores/userStore.ts
index 9838aed..f72e5cc 100644
--- a/src/stores/userStore.ts
+++ b/src/stores/userStore.ts
@@ -4,9 +4,10 @@ import type { User } from '@/types/user'
 import router from '@/router'
 import type { AxiosError } from 'axios'
 import axios from 'axios'
-import type { CredentialGetJson } from '@/types/CredentialGetJson'
+import type { CredentialRequestOptions } from '@/types/CredentialRequestOptions'
 import { base64urlToUint8array, initialCheckStatus, uint8arrayToBase64url } from '@/util'
 import authInterceptor from '@/services/authInterceptor'
+import type { CredentialCreationOptions } from '@/types/CredentialCreationOptions'
 
 export const useUserStore = defineStore('user', () => {
     const defaultUser: User = {
@@ -79,48 +80,48 @@ export const useUserStore = defineStore('user', () => {
         router.push({ name: 'login' })
     }
 
-    //const registerPasskey = async () => {
-    //    await authInterceptor
-    //        .post("/auth/bioRegistration")
-    //        .then(response => {
-    //            initialCheckStatus(response)
-    //            return response.data
-    //        })
-    //        .then(credentialCreateJson => ({
-    //            publicKey: {
-    //                ...credentialCreateJson.publicKey,
-    //                challenge: base64urlToUint8array(credentialCreateJson.publicKey.challenge),
-    //                user: {
-    //                    ...credentialCreateJson.publicKey.user,
-    //                    id: base64urlToUint8array(credentialCreateJson.publicKey.user.id),
-    //                },
-    //                excludeCredentials: credentialCreateJson.publicKey.excludeCredentials.map(credential => ({
-    //                    ...credential,
-    //                    id: base64urlToUint8array(credential.id),
-    //                })),
-    //                extensions: credentialCreateJson.publicKey.extensions,
-    //            },
-    //        }))
-    //        .then(credentialCreateOptions => {
-    //            return navigator.credentials.create(credentialCreateOptions)
-    //        })
-    //        .then(publicKeyCredential => ({
-    //            type: publicKeyCredential.type,
-    //            id: publicKeyCredential.id,
-    //            response: {
-    //                attestationObject: uint8arrayToBase64url(publicKeyCredential.response.attestationObject),
-    //                clientDataJSON: uint8arrayToBase64url(publicKeyCredential.response.clientDataJSON),
-    //                transports: publicKeyCredential.response.getTransports && publicKeyCredential.response.getTransports() || [],
-    //            },
-    //            clientExtensionResults: publicKeyCredential.getClientExtensionResults(),
-    //        }))
-    //        .then((encodedResult) =>
-    //            authInterceptor.post("/auth/finishBioRegistration", { credential: JSON.stringify(encodedResult) }
-    //            ))
-    //        .catch((error) =>
-    //            console.log(error)
-    //        );
-    //}
+    const registerPasskey = async () => {
+        try {
+            const response = await authInterceptor.post("/auth/bioRegistration");
+            initialCheckStatus(response);
+
+            const credentialCreateJson: CredentialCreationOptions = response.data;
+
+            const credentialCreateOptions: CredentialCreationOptions = {
+                publicKey: {
+                    ...credentialCreateJson.publicKey,
+                    challenge: base64urlToUint8array(credentialCreateJson.publicKey.challenge as unknown as string),
+                    user: {
+                        ...credentialCreateJson.publicKey.user,
+                        id: base64urlToUint8array(credentialCreateJson.publicKey.user.id as unknown as string),
+                    },
+                    excludeCredentials: credentialCreateJson.publicKey.excludeCredentials?.map(credential => ({
+                        ...credential,
+                        id: base64urlToUint8array(credential.id as unknown as string),
+                    })),
+                    extensions: credentialCreateJson.publicKey.extensions,
+                },
+            };
+
+            const publicKeyCredential = await navigator.credentials.create(credentialCreateOptions) as PublicKeyCredential;
+
+            const publicKeyResponse = publicKeyCredential.response as AuthenticatorAttestationResponse;
+            const encodedResult = {
+                type: publicKeyCredential.type,
+                id: publicKeyCredential.id,
+                response: {
+                    attestationObject: uint8arrayToBase64url(publicKeyResponse.attestationObject),
+                    clientDataJSON: uint8arrayToBase64url(publicKeyResponse.clientDataJSON),
+                    transports: publicKeyResponse.getTransports?.() || [],
+                },
+                clientExtensionResults: publicKeyCredential.getClientExtensionResults(),
+            };
+
+            await authInterceptor.post("/auth/finishBioRegistration", { credential: JSON.stringify(encodedResult) });
+        } catch (error) {
+            console.error(error);
+        }
+    }
 
     const bioLogin = async (username: string) => {
         try {
@@ -129,7 +130,7 @@ export const useUserStore = defineStore('user', () => {
             initialCheckStatus(request);
             console.log(request)
 
-            const credentialGetJson: CredentialGetJson = request.data;
+            const credentialGetJson: CredentialRequestOptions = request.data;
             console.log(credentialGetJson)
 
             const credentialGetOptions: CredentialRequestOptions = {
diff --git a/src/types/CredentialCreateJson.ts b/src/types/CredentialCreateJson.ts
deleted file mode 100644
index e69de29..0000000
diff --git a/src/types/CredentialCreationOptions.ts b/src/types/CredentialCreationOptions.ts
new file mode 100644
index 0000000..bf93888
--- /dev/null
+++ b/src/types/CredentialCreationOptions.ts
@@ -0,0 +1,3 @@
+export interface CredentialCreationOptions {
+    publicKey: PublicKeyCredentialCreationOptions;
+}
\ No newline at end of file
diff --git a/src/types/CredentialGetJson.ts b/src/types/CredentialRequestOptions.ts
similarity index 56%
rename from src/types/CredentialGetJson.ts
rename to src/types/CredentialRequestOptions.ts
index 027be9d..82692d0 100644
--- a/src/types/CredentialGetJson.ts
+++ b/src/types/CredentialRequestOptions.ts
@@ -1,3 +1,3 @@
-export interface CredentialGetJson {
+export interface CredentialRequestOptions {
         publicKey: PublicKeyCredentialRequestOptions;
 }
-- 
GitLab


From 802976f3caafe0eefc177569696ad30e75a60709 Mon Sep 17 00:00:00 2001
From: lmlnilse <lmlnilse@stud.ntnu.no>
Date: Mon, 29 Apr 2024 10:40:49 +0200
Subject: [PATCH 3/8] feat: Added alternative login images

---
 src/assets/bioAuthFace.png  | Bin 0 -> 21061 bytes
 src/assets/bioAuthTouch.png | Bin 0 -> 44238 bytes
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 src/assets/bioAuthFace.png
 create mode 100644 src/assets/bioAuthTouch.png

diff --git a/src/assets/bioAuthFace.png b/src/assets/bioAuthFace.png
new file mode 100644
index 0000000000000000000000000000000000000000..b03bb5d400029bcbc6d7bea9f5657da31e3e63a0
GIT binary patch
literal 21061
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
bQ_|7I|6hP@)6WJ9mV^aI?rGh1?A*TqJzb+v

literal 0
HcmV?d00001

diff --git a/src/assets/bioAuthTouch.png b/src/assets/bioAuthTouch.png
new file mode 100644
index 0000000000000000000000000000000000000000..363627b9c744b2a8dcabc9d2a69485d055045f43
GIT binary patch
literal 44238
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

literal 0
HcmV?d00001

-- 
GitLab


From e2d1c20a34db3bee409436ab41ff04d98fc801d0 Mon Sep 17 00:00:00 2001
From: lmlnilse <lmlnilse@stud.ntnu.no>
Date: Mon, 29 Apr 2024 10:41:18 +0200
Subject: [PATCH 4/8] feat: Added /bioAuthLogin to router/index.ts

---
 src/router/index.ts | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/router/index.ts b/src/router/index.ts
index 6247cd4..24e3042 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -114,9 +114,9 @@ const router = createRouter({
             component: () => import('@/views/NotFoundView.vue')
         },
         {
-            path: '/bioAuthLogin',
-            name: 'bioAuthLogin',
-            component: () => import('@/views/BioAuthLogin.vue')
+            path: '/addAlternativeLogin',
+            name: 'addAlternativeLogin',
+            component: () => import('@/views/AddAlternativeLogin.vue')
         }
     ],
     scrollBehavior() {
-- 
GitLab


From 4701c604c6fc689bafe4c41b0dddc0b28fb12280 Mon Sep 17 00:00:00 2001
From: lmlnilse <lmlnilse@stud.ntnu.no>
Date: Mon, 29 Apr 2024 10:41:47 +0200
Subject: [PATCH 5/8] chore: Added router.push to methods in userStore

---
 src/stores/userStore.ts | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/stores/userStore.ts b/src/stores/userStore.ts
index f72e5cc..4950b3e 100644
--- a/src/stores/userStore.ts
+++ b/src/stores/userStore.ts
@@ -42,7 +42,7 @@ export const useUserStore = defineStore('user', () => {
                 user.value.lastname = lastname
                 user.value.username = username
 
-                router.push({ name: 'configurations1' })
+                router.push({ name: 'addAlternativeLogin' })
             })
             .catch((error) => {
                 const axiosError = error as AxiosError
@@ -80,7 +80,7 @@ export const useUserStore = defineStore('user', () => {
         router.push({ name: 'login' })
     }
 
-    const registerPasskey = async () => {
+    const bioRegister = async () => {
         try {
             const response = await authInterceptor.post("/auth/bioRegistration");
             initialCheckStatus(response);
@@ -117,8 +117,10 @@ export const useUserStore = defineStore('user', () => {
                 clientExtensionResults: publicKeyCredential.getClientExtensionResults(),
             };
 
-            await authInterceptor.post("/auth/finishBioRegistration", { credential: JSON.stringify(encodedResult) });
+            await authInterceptor.post("/auth/finishBioRegistration", { credential: JSON.stringify(encodedResult) })
+                .then(response => { router.push({ name: 'configurations1' }) });
         } catch (error) {
+            router.push({ name: 'configurations1' })
             console.error(error);
         }
     }
@@ -192,6 +194,7 @@ export const useUserStore = defineStore('user', () => {
         login,
         logout,
         bioLogin,
+        bioRegister,
         errorMessage
     }
 })
-- 
GitLab


From 0b5f39d1f5f296f7a3ea2ab289f12d926e38caf1 Mon Sep 17 00:00:00 2001
From: lmlnilse <lmlnilse@stud.ntnu.no>
Date: Mon, 29 Apr 2024 10:42:01 +0200
Subject: [PATCH 6/8] chore: Created the BioAuthLogin view

---
 src/views/BioAuthLogin.vue | 99 --------------------------------------
 1 file changed, 99 deletions(-)
 delete mode 100644 src/views/BioAuthLogin.vue

diff --git a/src/views/BioAuthLogin.vue b/src/views/BioAuthLogin.vue
deleted file mode 100644
index 83c49a1..0000000
--- a/src/views/BioAuthLogin.vue
+++ /dev/null
@@ -1,99 +0,0 @@
-<template>
-    <button @click="testSignUp">Signup</button>
-    <button @click="testLogin">Login</button>
-</template>
-
-<script setup>
-import axios from 'axios'
-import { base64urlToUint8array, initialCheckStatus, uint8arrayToBase64url } from '@/utilo.js'
-import authInterceptor from '@/services/authInterceptor'
-
-const testSignUp = async () => {
-    await authInterceptor
-        .post("/auth/bioRegistration")
-        .then(response => {
-            initialCheckStatus(response)
-            return response.data
-        })
-        .then(credentialCreateJson => ({
-            publicKey: {
-                ...credentialCreateJson.publicKey,
-                challenge: base64urlToUint8array(credentialCreateJson.publicKey.challenge),
-                user: {
-                    ...credentialCreateJson.publicKey.user,
-                    id: base64urlToUint8array(credentialCreateJson.publicKey.user.id),
-                },
-                excludeCredentials: credentialCreateJson.publicKey.excludeCredentials.map(credential => ({
-                    ...credential,
-                    id: base64urlToUint8array(credential.id),
-                })),
-                extensions: credentialCreateJson.publicKey.extensions,
-            },
-        }))
-        .then(credentialCreateOptions => {
-            return navigator.credentials.create(credentialCreateOptions)
-        })
-        .then(publicKeyCredential => ({
-            type: publicKeyCredential.type,
-            id: publicKeyCredential.id,
-            response: {
-                attestationObject: uint8arrayToBase64url(publicKeyCredential.response.attestationObject),
-                clientDataJSON: uint8arrayToBase64url(publicKeyCredential.response.clientDataJSON),
-                transports: publicKeyCredential.response.getTransports && publicKeyCredential.response.getTransports() || [],
-            },
-            clientExtensionResults: publicKeyCredential.getClientExtensionResults(),
-        }))
-        .then((encodedResult) =>
-            authInterceptor.post("/auth/finishBioRegistration", { credential: JSON.stringify(encodedResult) }
-        ))
-        .catch((error) =>
-            console.log(error)
-        );
-}
-
-
-const testLogin = async () => {
-    await axios.post("http://localhost:8080/auth/bioLogin/katanta1")
-        // Collect from login form
-        .then(response => {
-            initialCheckStatus(response)
-            return response.data
-        })
-        .then(credentialGetJson => {
-            console.log(credentialGetJson);
-            return {
-                publicKey: {
-                    ...credentialGetJson.publicKey,
-                    allowCredentials: credentialGetJson.publicKey.allowCredentials
-                        && credentialGetJson.publicKey.allowCredentials.map(credential => ({
-                            ...credential,
-                            id: base64urlToUint8array(credential.id),
-                        })),
-                    challenge: base64urlToUint8array(credentialGetJson.publicKey.challenge),
-                    extensions: credentialGetJson.publicKey.extensions,
-                },
-            };
-        })
-        .then(credentialGetOptions => {
-            return navigator.credentials.get(credentialGetOptions)
-        })
-        .then(publicKeyCredential => ({
-            type: publicKeyCredential.type,
-            id: publicKeyCredential.id,
-            response: {
-                authenticatorData: uint8arrayToBase64url(publicKeyCredential.response.authenticatorData),
-                clientDataJSON: uint8arrayToBase64url(publicKeyCredential.response.clientDataJSON),
-                signature: uint8arrayToBase64url(publicKeyCredential.response.signature),
-                userHandle: publicKeyCredential.response.userHandle && uint8arrayToBase64url(publicKeyCredential.response.userHandle),
-            },
-            clientExtensionResults: publicKeyCredential.getClientExtensionResults(),
-        }))
-        .then((encodedResult) => {
-            console.log(encodedResult)
-            axios.post("http://localhost:8080/auth/finishBioLogin/katanta1", {
-                    credential: JSON.stringify(encodedResult)
-            })
-        })
-        .catch(error => console.log(error))
-}
-</script>
-- 
GitLab


From 6bd5c4c5dc7ec298b29a6c178a7f25a86d1051ef Mon Sep 17 00:00:00 2001
From: lmlnilse <lmlnilse@stud.ntnu.no>
Date: Mon, 29 Apr 2024 10:42:11 +0200
Subject: [PATCH 7/8] chore: Created the BioAuthLogin view

---
 src/views/AddAlternativeLogin.vue | 48 +++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)
 create mode 100644 src/views/AddAlternativeLogin.vue

diff --git a/src/views/AddAlternativeLogin.vue b/src/views/AddAlternativeLogin.vue
new file mode 100644
index 0000000..6494192
--- /dev/null
+++ b/src/views/AddAlternativeLogin.vue
@@ -0,0 +1,48 @@
+<template>
+    <div class="alt-login-main">
+        <h1>Alternativ innlogging</h1>
+        <div class="img-div">
+            <img src="@/assets/bioAuthTouch.png" alt="bioAuthTouch">
+            <img src="@/assets/bioAuthFace.png" alt="bioAuthFace">
+        </div>
+        <h2>Vil du logge på med touch eller face id?</h2>
+        <div class="btn-div">
+            <button @click="router.push('konfigurasjonSteg1')">Senere</button>
+            <button @click="userStore.bioRegister()">OK</button>
+        </div>
+    </div>
+</template>
+<script setup lang="ts">
+import { useUserStore } from '@/stores/userStore'
+import router from '@/router'
+
+const userStore = useUserStore()
+</script>
+
+<style scoped>
+.alt-login-main {
+    max-width: 800px;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+}
+
+.img-div {
+    display: flex;
+    justify-content: center;
+}
+
+img {
+    width: 30%;
+}
+
+img:first-child {
+    margin-right: 20px;
+}
+
+button {
+    margin: 10px;
+    width: 100px;
+    height: 40px;
+}
+</style>
\ No newline at end of file
-- 
GitLab


From 79bb9c21ea9f9c711d6dcf22adc8fc8b70981086 Mon Sep 17 00:00:00 2001
From: lmlnilse <lmlnilse@stud.ntnu.no>
Date: Mon, 29 Apr 2024 10:45:31 +0200
Subject: [PATCH 8/8] chore: Formatted code

---
 src/stores/userStore.ts                | 142 +++++++++++++++----------
 src/types/CredentialCreationOptions.ts |   4 +-
 src/types/CredentialRequestOptions.ts  |   2 +-
 src/util.ts                            |  27 ++---
 src/utilo.js                           |  24 +++--
 src/views/AddAlternativeLogin.vue      |   6 +-
 src/views/RegisterLoginView.vue        |   2 -
 7 files changed, 118 insertions(+), 89 deletions(-)

diff --git a/src/stores/userStore.ts b/src/stores/userStore.ts
index 4950b3e..bd82c7e 100644
--- a/src/stores/userStore.ts
+++ b/src/stores/userStore.ts
@@ -82,110 +82,134 @@ export const useUserStore = defineStore('user', () => {
 
     const bioRegister = async () => {
         try {
-            const response = await authInterceptor.post("/auth/bioRegistration");
-            initialCheckStatus(response);
+            const response = await authInterceptor.post('/auth/bioRegistration')
+            initialCheckStatus(response)
 
-            const credentialCreateJson: CredentialCreationOptions = response.data;
+            const credentialCreateJson: CredentialCreationOptions = response.data
 
             const credentialCreateOptions: CredentialCreationOptions = {
                 publicKey: {
                     ...credentialCreateJson.publicKey,
-                    challenge: base64urlToUint8array(credentialCreateJson.publicKey.challenge as unknown as string),
+                    challenge: base64urlToUint8array(
+                        credentialCreateJson.publicKey.challenge as unknown as string
+                    ),
                     user: {
                         ...credentialCreateJson.publicKey.user,
-                        id: base64urlToUint8array(credentialCreateJson.publicKey.user.id as unknown as string),
+                        id: base64urlToUint8array(
+                            credentialCreateJson.publicKey.user.id as unknown as string
+                        )
                     },
-                    excludeCredentials: credentialCreateJson.publicKey.excludeCredentials?.map(credential => ({
-                        ...credential,
-                        id: base64urlToUint8array(credential.id as unknown as string),
-                    })),
-                    extensions: credentialCreateJson.publicKey.extensions,
-                },
-            };
-
-            const publicKeyCredential = await navigator.credentials.create(credentialCreateOptions) as PublicKeyCredential;
-
-            const publicKeyResponse = publicKeyCredential.response as AuthenticatorAttestationResponse;
+                    excludeCredentials: credentialCreateJson.publicKey.excludeCredentials?.map(
+                        (credential) => ({
+                            ...credential,
+                            id: base64urlToUint8array(credential.id as unknown as string)
+                        })
+                    ),
+                    extensions: credentialCreateJson.publicKey.extensions
+                }
+            }
+
+            const publicKeyCredential = (await navigator.credentials.create(
+                credentialCreateOptions
+            )) as PublicKeyCredential
+
+            const publicKeyResponse =
+                publicKeyCredential.response as AuthenticatorAttestationResponse
             const encodedResult = {
                 type: publicKeyCredential.type,
                 id: publicKeyCredential.id,
                 response: {
                     attestationObject: uint8arrayToBase64url(publicKeyResponse.attestationObject),
                     clientDataJSON: uint8arrayToBase64url(publicKeyResponse.clientDataJSON),
-                    transports: publicKeyResponse.getTransports?.() || [],
+                    transports: publicKeyResponse.getTransports?.() || []
                 },
-                clientExtensionResults: publicKeyCredential.getClientExtensionResults(),
-            };
-
-            await authInterceptor.post("/auth/finishBioRegistration", { credential: JSON.stringify(encodedResult) })
-                .then(response => { router.push({ name: 'configurations1' }) });
+                clientExtensionResults: publicKeyCredential.getClientExtensionResults()
+            }
+
+            await authInterceptor
+                .post('/auth/finishBioRegistration', { credential: JSON.stringify(encodedResult) })
+                .then((response) => {
+                    router.push({ name: 'configurations1' })
+                })
         } catch (error) {
             router.push({ name: 'configurations1' })
-            console.error(error);
+            console.error(error)
         }
     }
 
     const bioLogin = async (username: string) => {
         try {
-            const request = await axios.post(`http://localhost:8080/auth/bioLogin/${username}`);
+            const request = await axios.post(`http://localhost:8080/auth/bioLogin/${username}`)
 
-            initialCheckStatus(request);
+            initialCheckStatus(request)
             console.log(request)
 
-            const credentialGetJson: CredentialRequestOptions = request.data;
+            const credentialGetJson: CredentialRequestOptions = request.data
             console.log(credentialGetJson)
 
             const credentialGetOptions: CredentialRequestOptions = {
                 publicKey: {
                     ...credentialGetJson.publicKey,
-                    allowCredentials: credentialGetJson.publicKey.allowCredentials
-                        && credentialGetJson.publicKey.allowCredentials.map(credential => ({
+                    allowCredentials:
+                        credentialGetJson.publicKey.allowCredentials &&
+                        credentialGetJson.publicKey.allowCredentials.map((credential) => ({
                             ...credential,
-                            id: base64urlToUint8array(credential.id as unknown as string),
+                            id: base64urlToUint8array(credential.id as unknown as string)
                         })),
-                    challenge: base64urlToUint8array(credentialGetJson.publicKey.challenge as unknown as string),
-                    extensions: credentialGetJson.publicKey.extensions,
-                },
-            };
+                    challenge: base64urlToUint8array(
+                        credentialGetJson.publicKey.challenge as unknown as string
+                    ),
+                    extensions: credentialGetJson.publicKey.extensions
+                }
+            }
 
-            const publicKeyCredential = await navigator.credentials.get(credentialGetOptions) as PublicKeyCredential;
+            const publicKeyCredential = (await navigator.credentials.get(
+                credentialGetOptions
+            )) as PublicKeyCredential
 
             // Extract response data based on the type of credential
-            const response = publicKeyCredential.response as AuthenticatorAssertionResponse;
+            const response = publicKeyCredential.response as AuthenticatorAssertionResponse
 
             const encodedResult = {
                 type: publicKeyCredential.type,
                 id: publicKeyCredential.id,
                 response: {
-                    authenticatorData: response.authenticatorData && uint8arrayToBase64url(response.authenticatorData),
-                    clientDataJSON: response.clientDataJSON && uint8arrayToBase64url(response.clientDataJSON),
+                    authenticatorData:
+                        response.authenticatorData &&
+                        uint8arrayToBase64url(response.authenticatorData),
+                    clientDataJSON:
+                        response.clientDataJSON && uint8arrayToBase64url(response.clientDataJSON),
 
                     signature: response.signature && uint8arrayToBase64url(response.signature),
-                    userHandle: response.userHandle && uint8arrayToBase64url(response.userHandle),
+                    userHandle: response.userHandle && uint8arrayToBase64url(response.userHandle)
                 },
-                clientExtensionResults: publicKeyCredential.getClientExtensionResults(),
-            };
-            console.log(encodedResult);
-
-            await axios.post("http://localhost:8080/auth/finishBioLogin/katanta1", {
-                credential: JSON.stringify(encodedResult)
-            }).then((response) => {
-                sessionStorage.setItem('accessToken', response.data.accessToken)
-                localStorage.setItem('refreshToken', response.data.refreshToken)
-
-                user.value.firstname = response.data.firstName
-                user.value.lastname = response.data.lastName
-                user.value.username = response.data.username
-
-                router.push({ name: 'home' })
-            }).catch((error) => {
-                const axiosError = error as AxiosError
-                errorMessage.value = (axiosError.response?.data as string) || 'An error occurred'
-                console.log("hei :" + errorMessage.value)
-            })
+                clientExtensionResults: publicKeyCredential.getClientExtensionResults()
+            }
+            console.log(encodedResult)
+
+            await axios
+                .post('http://localhost:8080/auth/finishBioLogin/katanta1', {
+                    credential: JSON.stringify(encodedResult)
+                })
+                .then((response) => {
+                    sessionStorage.setItem('accessToken', response.data.accessToken)
+                    localStorage.setItem('refreshToken', response.data.refreshToken)
+
+                    user.value.firstname = response.data.firstName
+                    user.value.lastname = response.data.lastName
+                    user.value.username = response.data.username
+
+                    router.push({ name: 'home' })
+                })
+                .catch((error) => {
+                    const axiosError = error as AxiosError
+                    errorMessage.value =
+                        (axiosError.response?.data as string) || 'An error occurred'
+                    console.log('hei :' + errorMessage.value)
+                })
         } catch (error) {
             // Handle errors
-            console.log(error);
+            console.log(error)
         }
     }
 
diff --git a/src/types/CredentialCreationOptions.ts b/src/types/CredentialCreationOptions.ts
index bf93888..b6fdd7a 100644
--- a/src/types/CredentialCreationOptions.ts
+++ b/src/types/CredentialCreationOptions.ts
@@ -1,3 +1,3 @@
 export interface CredentialCreationOptions {
-    publicKey: PublicKeyCredentialCreationOptions;
-}
\ No newline at end of file
+    publicKey: PublicKeyCredentialCreationOptions
+}
diff --git a/src/types/CredentialRequestOptions.ts b/src/types/CredentialRequestOptions.ts
index 82692d0..4349a83 100644
--- a/src/types/CredentialRequestOptions.ts
+++ b/src/types/CredentialRequestOptions.ts
@@ -1,3 +1,3 @@
 export interface CredentialRequestOptions {
-        publicKey: PublicKeyCredentialRequestOptions;
+    publicKey: PublicKeyCredentialRequestOptions
 }
diff --git a/src/util.ts b/src/util.ts
index 6c23fdb..7f6cbfc 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -1,30 +1,33 @@
-import base64js from 'base64-js';
-import  { type AxiosResponse } from 'axios'
+import base64js from 'base64-js'
+import { type AxiosResponse } from 'axios'
 
 export function base64urlToUint8array(base64Bytes: string): Uint8Array {
-    const padding = '===='.substring(0, (4 - (base64Bytes.length % 4)) % 4);
-    return base64js.toByteArray((base64Bytes + padding).replace(/\//g, "_").replace(/\+/g, "-"));
+    const padding = '===='.substring(0, (4 - (base64Bytes.length % 4)) % 4)
+    return base64js.toByteArray((base64Bytes + padding).replace(/\//g, '_').replace(/\+/g, '-'))
 }
 
-
 export function uint8arrayToBase64url(bytes: Uint8Array | ArrayBuffer | number[]): string {
     if (bytes instanceof Uint8Array) {
-        return base64js.fromByteArray(bytes).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
+        return base64js
+            .fromByteArray(bytes)
+            .replace(/\+/g, '-')
+            .replace(/\//g, '_')
+            .replace(/=/g, '')
     } else {
-        return uint8arrayToBase64url(new Uint8Array(bytes));
+        return uint8arrayToBase64url(new Uint8Array(bytes))
     }
 }
 
 export function checkStatus(response: AxiosResponse<any>): AxiosResponse<any> | undefined {
     if (response.status !== 200) {
-        console.log("an error occurred: ", response.statusText);
-        return undefined;
+        console.log('an error occurred: ', response.statusText)
+        return undefined
     } else {
-        return response;
+        return response
     }
 }
 
 export function initialCheckStatus(response: AxiosResponse<any>): any {
-    checkStatus(response);
-    return response.data;
+    checkStatus(response)
+    return response.data
 }
diff --git a/src/utilo.js b/src/utilo.js
index 5cbf790..4125c85 100644
--- a/src/utilo.js
+++ b/src/utilo.js
@@ -1,24 +1,28 @@
-import base64js from 'base64-js';
+import base64js from 'base64-js'
 
 export function base64urlToUint8array(base64Bytes) {
-    const padding = '===='.substring(0, (4 - (base64Bytes.length % 4)) % 4);
-    return base64js.toByteArray((base64Bytes + padding).replace(/\//g, "_").replace(/\+/g, "-"));
+    const padding = '===='.substring(0, (4 - (base64Bytes.length % 4)) % 4)
+    return base64js.toByteArray((base64Bytes + padding).replace(/\//g, '_').replace(/\+/g, '-'))
 }
 export function uint8arrayToBase64url(bytes) {
     if (bytes instanceof Uint8Array) {
-        return base64js.fromByteArray(bytes).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
+        return base64js
+            .fromByteArray(bytes)
+            .replace(/\+/g, '-')
+            .replace(/\//g, '_')
+            .replace(/=/g, '')
     } else {
-        return uint8arrayToBase64url(new Uint8Array(bytes));
+        return uint8arrayToBase64url(new Uint8Array(bytes))
     }
 }
 export function checkStatus(response) {
     if (response.status !== 200) {
-        console.log("an error occurred: ", response.body);
+        console.log('an error occurred: ', response.body)
     } else {
-        return response;
+        return response
     }
 }
 export function initialCheckStatus(response) {
-    checkStatus(response);
-    return response.data;
-}
\ No newline at end of file
+    checkStatus(response)
+    return response.data
+}
diff --git a/src/views/AddAlternativeLogin.vue b/src/views/AddAlternativeLogin.vue
index 6494192..554f09f 100644
--- a/src/views/AddAlternativeLogin.vue
+++ b/src/views/AddAlternativeLogin.vue
@@ -2,8 +2,8 @@
     <div class="alt-login-main">
         <h1>Alternativ innlogging</h1>
         <div class="img-div">
-            <img src="@/assets/bioAuthTouch.png" alt="bioAuthTouch">
-            <img src="@/assets/bioAuthFace.png" alt="bioAuthFace">
+            <img src="@/assets/bioAuthTouch.png" alt="bioAuthTouch" />
+            <img src="@/assets/bioAuthFace.png" alt="bioAuthFace" />
         </div>
         <h2>Vil du logge på med touch eller face id?</h2>
         <div class="btn-div">
@@ -45,4 +45,4 @@ button {
     width: 100px;
     height: 40px;
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/src/views/RegisterLoginView.vue b/src/views/RegisterLoginView.vue
index 8346f4b..738002a 100644
--- a/src/views/RegisterLoginView.vue
+++ b/src/views/RegisterLoginView.vue
@@ -4,7 +4,6 @@ import FormRegister from '@/components/FormRegister.vue'
 import { onMounted, ref } from 'vue'
 import { useRouter } from 'vue-router'
 
-
 const router = useRouter()
 
 const isLogin = ref<boolean>(true)
@@ -47,7 +46,6 @@ onMounted(() => {
             <FormLogin v-if="isLogin" />
             <FormRegister v-else />
         </div>
-
     </div>
 </template>
 
-- 
GitLab