PHP Classes

File: resources/js/Pages/Profile/Partials/TwoFactorAuthenticationForm.vue

Recommend this page to a friend!
  Classes of Robert Devenyi   Iceburg SAAS PHP CRM Open Source   resources/js/Pages/Profile/Partials/TwoFactorAuthenticationForm.vue   Download  
File: resources/js/Pages/Profile/Partials/TwoFactorAuthenticationForm.vue
Role: Auxiliary data
Content type: text/plain
Description: Auxiliary data
Class: Iceburg SAAS PHP CRM Open Source
Application to manage the contacts of customers
Author: By
Last change:
Date: 1 year ago
Size: 9,324 bytes
 

Contents

Class file image Download
<script setup> import { ref, computed, watch } from 'vue'; import { Inertia } from '@inertiajs/inertia'; import { useForm, usePage } from '@inertiajs/inertia-vue3'; import ActionSection from '@/Components/ActionSection.vue'; import ConfirmsPassword from '@/Components/ConfirmsPassword.vue'; import DangerButton from '@/Components/DangerButton.vue'; import InputError from '@/Components/InputError.vue'; import InputLabel from '@/Components/InputLabel.vue'; import PrimaryButton from '@/Components/PrimaryButton.vue'; import SecondaryButton from '@/Components/SecondaryButton.vue'; import TextInput from '@/Components/TextInput.vue'; const props = defineProps({ requiresConfirmation: Boolean, }); const enabling = ref(false); const confirming = ref(false); const disabling = ref(false); const qrCode = ref(null); const setupKey = ref(null); const recoveryCodes = ref([]); const confirmationForm = useForm({ code: '', }); const twoFactorEnabled = computed( () => ! enabling.value && usePage().props.value.user?.two_factor_enabled, ); watch(twoFactorEnabled, () => { if (! twoFactorEnabled.value) { confirmationForm.reset(); confirmationForm.clearErrors(); } }); const enableTwoFactorAuthentication = () => { enabling.value = true; Inertia.post('/user/two-factor-authentication', {}, { preserveScroll: true, onSuccess: () => Promise.all([ showQrCode(), showSetupKey(), showRecoveryCodes(), ]), onFinish: () => { enabling.value = false; confirming.value = props.requiresConfirmation; }, }); }; const showQrCode = () => { return axios.get('/user/two-factor-qr-code').then(response => { qrCode.value = response.data.svg; }); }; const showSetupKey = () => { return axios.get('/user/two-factor-secret-key').then(response => { setupKey.value = response.data.secretKey; }); } const showRecoveryCodes = () => { return axios.get('/user/two-factor-recovery-codes').then(response => { recoveryCodes.value = response.data; }); }; const confirmTwoFactorAuthentication = () => { confirmationForm.post('/user/confirmed-two-factor-authentication', { errorBag: "confirmTwoFactorAuthentication", preserveScroll: true, preserveState: true, onSuccess: () => { confirming.value = false; qrCode.value = null; setupKey.value = null; }, }); }; const regenerateRecoveryCodes = () => { axios .post('/user/two-factor-recovery-codes') .then(() => showRecoveryCodes()); }; const disableTwoFactorAuthentication = () => { disabling.value = true; Inertia.delete('/user/two-factor-authentication', { preserveScroll: true, onSuccess: () => { disabling.value = false; confirming.value = false; }, }); }; </script> <template> <ActionSection> <template #title> Two Factor Authentication </template> <template #description> Add additional security to your account using two factor authentication. </template> <template #content> <h3 v-if="twoFactorEnabled && ! confirming" class="text-lg font-medium text-gray-900"> You have enabled two factor authentication. </h3> <h3 v-else-if="twoFactorEnabled && confirming" class="text-lg font-medium text-gray-900"> Finish enabling two factor authentication. </h3> <h3 v-else class="text-lg font-medium text-gray-900"> You have not enabled two factor authentication. </h3> <div class="mt-3 max-w-xl text-sm text-gray-600"> <p> When two factor authentication is enabled, you will be prompted for a secure, random token during authentication. You may retrieve this token from your phone's Google Authenticator application. </p> </div> <div v-if="twoFactorEnabled"> <div v-if="qrCode"> <div class="mt-4 max-w-xl text-sm text-gray-600"> <p v-if="confirming" class="font-semibold"> To finish enabling two factor authentication, scan the following QR code using your phone's authenticator application or enter the setup key and provide the generated OTP code. </p> <p v-else> Two factor authentication is now enabled. Scan the following QR code using your phone's authenticator application or enter the setup key. </p> </div> <div class="mt-4" v-html="qrCode" /> <div class="mt-4 max-w-xl text-sm text-gray-600" v-if="setupKey"> <p class="font-semibold"> Setup Key: <span v-html="setupKey"></span> </p> </div> <div v-if="confirming" class="mt-4"> <InputLabel for="code" value="Code" /> <TextInput id="code" v-model="confirmationForm.code" type="text" name="code" class="block mt-1 w-1/2" inputmode="numeric" autofocus autocomplete="one-time-code" @keyup.enter="confirmTwoFactorAuthentication" /> <InputError :message="confirmationForm.errors.code" class="mt-2" /> </div> </div> <div v-if="recoveryCodes.length > 0 && ! confirming"> <div class="mt-4 max-w-xl text-sm text-gray-600"> <p class="font-semibold"> Store these recovery codes in a secure password manager. They can be used to recover access to your account if your two factor authentication device is lost. </p> </div> <div class="grid gap-1 max-w-xl mt-4 px-4 py-4 font-mono text-sm bg-gray-100 rounded-lg"> <div v-for="code in recoveryCodes" :key="code"> {{ code }} </div> </div> </div> </div> <div class="mt-5"> <div v-if="! twoFactorEnabled"> <ConfirmsPassword @confirmed="enableTwoFactorAuthentication"> <PrimaryButton type="button" :class="{ 'opacity-25': enabling }" :disabled="enabling"> Enable </PrimaryButton> </ConfirmsPassword> </div> <div v-else> <ConfirmsPassword @confirmed="confirmTwoFactorAuthentication"> <PrimaryButton v-if="confirming" type="button" class="mr-3" :class="{ 'opacity-25': enabling }" :disabled="enabling" > Confirm </PrimaryButton> </ConfirmsPassword> <ConfirmsPassword @confirmed="regenerateRecoveryCodes"> <SecondaryButton v-if="recoveryCodes.length > 0 && ! confirming" class="mr-3" > Regenerate Recovery Codes </SecondaryButton> </ConfirmsPassword> <ConfirmsPassword @confirmed="showRecoveryCodes"> <SecondaryButton v-if="recoveryCodes.length === 0 && ! confirming" class="mr-3" > Show Recovery Codes </SecondaryButton> </ConfirmsPassword> <ConfirmsPassword @confirmed="disableTwoFactorAuthentication"> <SecondaryButton v-if="confirming" :class="{ 'opacity-25': disabling }" :disabled="disabling" > Cancel </SecondaryButton> </ConfirmsPassword> <ConfirmsPassword @confirmed="disableTwoFactorAuthentication"> <DangerButton v-if="! confirming" :class="{ 'opacity-25': disabling }" :disabled="disabling" > Disable </DangerButton> </ConfirmsPassword> </div> </div> </template> </ActionSection> </template>