mirror of
https://github.com/dreamhunter2333/cloudflare_temp_email.git
synced 2026-09-05 07:27:27 +08:00
feat: add passkey (#384)
This commit is contained in:
@@ -1,18 +1,17 @@
|
||||
<script setup>
|
||||
import { useMessage } from 'naive-ui'
|
||||
import { useRouter } from 'vue-router'
|
||||
import { computed, onMounted, ref } from "vue";
|
||||
import { onMounted, ref } from "vue";
|
||||
import { useI18n } from 'vue-i18n'
|
||||
|
||||
import { api } from '../../api';
|
||||
import { useGlobalState } from '../../store'
|
||||
import { hashPassword } from '../../utils';
|
||||
import { startAuthentication } from '@simplewebauthn/browser';
|
||||
|
||||
import Turnstile from '../../components/Turnstile.vue';
|
||||
|
||||
const { userJwt, userTab, userOpenSettings, openSettings } = useGlobalState()
|
||||
const { userJwt, userOpenSettings, openSettings } = useGlobalState()
|
||||
const message = useMessage();
|
||||
const router = useRouter();
|
||||
|
||||
const { t } = useI18n({
|
||||
messages: {
|
||||
@@ -33,6 +32,7 @@ const { t } = useI18n({
|
||||
pleaseInputCode: 'Please input code',
|
||||
pleaseCompleteTurnstile: 'Please complete turnstile',
|
||||
pleaseLogin: 'Please login',
|
||||
loginWithPasskey: 'Login with Passkey',
|
||||
},
|
||||
zh: {
|
||||
login: '登录',
|
||||
@@ -51,6 +51,7 @@ const { t } = useI18n({
|
||||
pleaseInputCode: '请输入验证码',
|
||||
pleaseCompleteTurnstile: '请完成人机验证',
|
||||
pleaseLogin: '请登录',
|
||||
loginWithPasskey: '使用 Passkey 登录',
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -156,6 +157,33 @@ const emailSignup = async () => {
|
||||
}
|
||||
};
|
||||
|
||||
const passkeyLogin = async () => {
|
||||
try {
|
||||
const options = await api.fetch(`/user_api/passkey/authenticate_request`, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({
|
||||
domain: location.hostname,
|
||||
})
|
||||
})
|
||||
const credential = await startAuthentication(options)
|
||||
|
||||
// Send the result to the server and return the promise.
|
||||
const res = await api.fetch(`/user_api/passkey/authenticate_response`, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({
|
||||
origin: location.origin,
|
||||
domain: location.hostname,
|
||||
credential
|
||||
})
|
||||
})
|
||||
userJwt.value = res.jwt;
|
||||
location.reload();
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
message.error(e.message)
|
||||
}
|
||||
};
|
||||
|
||||
onMounted(async () => {
|
||||
|
||||
});
|
||||
@@ -178,6 +206,10 @@ onMounted(async () => {
|
||||
<n-button @click="showModal = true" type="info" quaternary size="tiny">
|
||||
{{ t('forgotPassword') }}
|
||||
</n-button>
|
||||
<n-divider />
|
||||
<n-button @click="passkeyLogin" type="primary" block secondary strong>
|
||||
{{ t('loginWithPasskey') }}
|
||||
</n-button>
|
||||
</n-form>
|
||||
</n-tab-pane>
|
||||
<n-tab-pane v-if="userOpenSettings.enable" name="signup" :tab="t('register')">
|
||||
|
||||
Reference in New Issue
Block a user