Implement passkey support checks in registration page, including user feedback for unsupported scenarios. Update logic to determine passkey availability based on secure context and browser compatibility, enhancing user experience during registration.
Some checks failed
Code Analysis (JS/Vue) / analyze (push) Failing after 50s
Some checks failed
Code Analysis (JS/Vue) / analyze (push) Failing after 50s
This commit is contained in:
@@ -20,6 +20,9 @@
|
|||||||
<div class="text-sm text-gray-700">
|
<div class="text-sm text-gray-700">
|
||||||
<div class="font-medium">Registrierungsmethode</div>
|
<div class="font-medium">Registrierungsmethode</div>
|
||||||
<div class="text-xs text-gray-600">Passkey = Anmeldung ohne Passwort (z.B. FaceID/TouchID/Windows Hello)</div>
|
<div class="text-xs text-gray-600">Passkey = Anmeldung ohne Passwort (z.B. FaceID/TouchID/Windows Hello)</div>
|
||||||
|
<div v-if="!isPasskeySupported" class="text-xs text-red-700 mt-1">
|
||||||
|
Passkeys aktuell nicht verfügbar: {{ passkeySupportReason || 'Bitte HTTPS/aktuellen Browser verwenden.' }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<label class="flex items-center gap-2 text-sm font-medium text-gray-800">
|
<label class="flex items-center gap-2 text-sm font-medium text-gray-800">
|
||||||
<input v-model="usePasskey" type="checkbox" class="h-4 w-4" :disabled="isLoading || !isPasskeySupported">
|
<input v-model="usePasskey" type="checkbox" class="h-4 w-4" :disabled="isLoading || !isPasskeySupported">
|
||||||
@@ -194,7 +197,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref } from 'vue'
|
import { onMounted, ref } from 'vue'
|
||||||
import { AlertCircle, Check, Loader2, Info } from 'lucide-vue-next'
|
import { AlertCircle, Check, Loader2, Info } from 'lucide-vue-next'
|
||||||
|
|
||||||
const formData = ref({
|
const formData = ref({
|
||||||
@@ -210,9 +213,21 @@ const errorMessage = ref('')
|
|||||||
const successMessage = ref('')
|
const successMessage = ref('')
|
||||||
const usePasskey = ref(false)
|
const usePasskey = ref(false)
|
||||||
const isPasskeySupported = ref(false)
|
const isPasskeySupported = ref(false)
|
||||||
if (process.client) {
|
const passkeySupportReason = ref('')
|
||||||
isPasskeySupported.value = !!window.PublicKeyCredential
|
|
||||||
|
onMounted(() => {
|
||||||
|
try {
|
||||||
|
const hasPKC = typeof window !== 'undefined' && typeof window.PublicKeyCredential !== 'undefined'
|
||||||
|
const secure = typeof window !== 'undefined' && !!window.isSecureContext
|
||||||
|
isPasskeySupported.value = !!(hasPKC && secure)
|
||||||
|
if (!secure) passkeySupportReason.value = 'Kein Secure Context (HTTPS oder localhost erforderlich).'
|
||||||
|
else if (!hasPKC) passkeySupportReason.value = 'Browser unterstützt WebAuthn/Passkeys nicht.'
|
||||||
|
else passkeySupportReason.value = ''
|
||||||
|
} catch {
|
||||||
|
isPasskeySupported.value = false
|
||||||
|
passkeySupportReason.value = 'Passkey-Check fehlgeschlagen.'
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
|
||||||
const handleRegister = async () => {
|
const handleRegister = async () => {
|
||||||
errorMessage.value = ''
|
errorMessage.value = ''
|
||||||
@@ -271,7 +286,7 @@ const handleRegisterWithPasskey = async () => {
|
|||||||
successMessage.value = ''
|
successMessage.value = ''
|
||||||
|
|
||||||
if (!isPasskeySupported.value) {
|
if (!isPasskeySupported.value) {
|
||||||
errorMessage.value = 'Passkeys sind in diesem Browser/unter dieser URL nicht verfügbar (HTTPS erforderlich).'
|
errorMessage.value = passkeySupportReason.value || 'Passkeys sind in diesem Browser/unter dieser URL nicht verfügbar (HTTPS erforderlich).'
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user