Proses persediaan Ory Kratos di mana kata laluan tidak berjaya ditukar
P粉776412597
2023-08-31 18:45:58
<p>Saya mencipta antara muka pengguna saya sendiri untuk proses persediaan Ory Kratos. Masalah yang saya hadapi ialah walaupun mesej kembali bahawa tetapan saya telah berjaya dikemas kini, kata laluan baharu saya tidak ditunjukkan dan saya tidak berjaya memulihkan akaun saya. Di bawah ialah coretan kod yang saya gunakan untuk memaparkan UI menggunakan Vue 3. </p>
<pre class="brush:js;toolbar:false;">// SettingsVue.vue
<template>
<div id="tetapan">
<HomeTopbar :views="[]"
<div class="setting-wrapper">
<h1 class="poppins fs_3 fw_6">Pulihkan kata laluan anda</h1>
<OryFlow v-if="settingsFlow"
:flow="settingsFlow"
title="Log Masuk"
form-id="setting-form"
/>
</div>
</div>
</template>
<penyiapan skrip lang="ts">
import { ref } daripada 'vue';
/* ory */
import { injectStrict } daripada '@/utils';
import { $ory } daripada '@/plugins/ory';
import { makeHandleGetFlowError } daripada '@/utils/flows';
/* jenis */
jenis import { SelfServiceSettingsFlow } daripada '@ory/kratos-client';
/* boleh digubah */
import { useRoute, useRouter } daripada 'vue-router';
/* komponen */
import OryFlow daripada '@/components/flows/OryFlow.vue';
import HomeTopbar daripada '@/components/ui/HomeTopbar.vue';
const ory = injectStrict($ory);
laluan const = useRoute();
penghala const = useRouter();
const settingsFlow = ref<SelfServiceSettingsFlow | undefined>();
const handleGetFlowError = makeHandleGetFlowError(router);
// semak sama ada kita mempunyai param aliran
const { flow } = route.query;
const initializeSelfServiceSettingsFlowForBrowsers = () =>
ory
.initializeSelfServiceSettingsFlowForBrowsers()
.then((respons) => {
settingsFlow.value = response.data;
router.replace({
pertanyaan: {
aliran: response.data.id,
},
});
})
.catch(handleGetFlowError);
jika (jenis aliran !== 'rentetan') {
// jika tiada aliran dalam laluan kami,
// kita perlu memulakan aliran log masuk kita
initializeSelfServiceSettingsFlowForBrowsers();
} lain {
ory
.getSelfServiceSettingsFlow(flow)
.then((respons) => {
settingsFlow.value = response.data;
})
.catch(handleGetFlowError);
}
</skrip>
<style scoped lang="scss">
#settings {
lebar: 100%;
ketinggian: 100%;
.setting-wrapper {
margin: var(--space-5) auto 0 auto;
padding: 0 var(--space-3);
margin-top: var(--space-4);
lebar: 300px;
}
}
</style>
</pra>
<pre class="brush:js;toolbar:false;">#OryFlow.vue
<template>
<div class="ory-flow">
<form :id="formId" :action="flow.ui.action" :method="flow.ui.method">
<OryUiNode v-for="nod dalam flow.ui.nodes"
:key="getNodeId(nod)"
:id="getNodeId(nod)"
:node="node"
class="ui-node"
/>
</form>
<div class="mesej" v-if="flow.ui.messages">
<OryUiMessage v-for="mesej dalam flow.ui.messages" :message="message" />
</div>
</div>
</template>
<penyiapan skrip lang="ts">
jenis import {
SelfServiceLoginFlow,
SelfServiceRegistrationFlow,
SelfServiceRecoveryFlow,
SelfServiceSettingsFlow,
SelfServiceVerificationFlow,
} daripada '@ory/kratos-client';
import OryUiNode daripada './OryUiNode.vue';
import OryUiMessage daripada './OryUiMessage.vue';
import { getNodeId } daripada '@ory/integrations/ui';
defineProps<{
aliran:
| SelfServiceLoginFlow
| SelfServiceRegistrationFlow
| SelfServiceRecoveryFlow
| SelfServiceSettingsFlow
| SelfServiceVerificationFlow;
formId?: string;
}>();
</skrip>
<style scoped lang="scss">
.ui-node + .ui-node {
margin-top: var(--space-2);
}
.message {
margin-top: var(--space-2);
}
</style>
</pra>
Jadi menyelesaikan masalah ini sebenarnya agak mudah dan jelas, yang menjadi jelas selepas saya menyemak kod sumber React Self-Service UI yang dibuat dan diselenggara oleh pasukan Ory.
Jika anda menyerahkan semua kumpulan nod UI bersama-sama ke dalam bentuk yang sama, ia hanya akan berada dalam kumpulan
default
组和另一个组上执行。在我的情况下,在成功处理profile
组后,它忽略了password
组。我遵循的解决方案基本上与我在前一段提到的存储库中提供的解决方案相同。实现一个过滤机制,允许您使用两个单独的表单,从而在提交表单时分离这些值。请记住,您必须始终提交default
kerana ia termasuk token CSRF anda .Berikut ialah kod dikemas kini yang menyelesaikan masalah saya:
Pertama, tambah sokongan untuk atribut
:only
untuk menapis nod:Seterusnya, manfaatkan sifat baharu ini dalam bentuk untuk menapis kumpulan nod sahaja
password
和default
。您可以使用相同的方法在另一个表单中过滤profile
和default
.