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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/=; 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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