feat(07.3-03): frontend remember_me — checkbox + ref threading + store pass-through
- LoginView.vue: add rememberMe ref(false) + "Stay signed in for 30 days" checkbox in password step; thread rememberMe.value through all 3 submit handlers (submitPassword, submitTotp, submitBackupCode) (D-12) - stores/auth.js: login() forwards options.rememberMe as remember_me in api.login body (D-12) - api/client.js: no change needed — already forwards full body verbatim - Frontend build passes (vite build exits 0)
This commit is contained in:
@@ -66,6 +66,7 @@ export const useAuthStore = defineStore('auth', () => {
|
|||||||
password,
|
password,
|
||||||
totp_code: options.totpCode ?? null,
|
totp_code: options.totpCode ?? null,
|
||||||
backup_code: options.backupCode ?? null,
|
backup_code: options.backupCode ?? null,
|
||||||
|
remember_me: options.rememberMe ?? false,
|
||||||
})
|
})
|
||||||
|
|
||||||
if (data.requires_totp) {
|
if (data.requires_totp) {
|
||||||
|
|||||||
@@ -27,6 +27,17 @@
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Stay signed in checkbox (D-12) -->
|
||||||
|
<div class="flex items-center gap-2">
|
||||||
|
<input
|
||||||
|
v-model="rememberMe"
|
||||||
|
id="remember-me"
|
||||||
|
type="checkbox"
|
||||||
|
class="rounded border-gray-300 text-indigo-600 focus:ring-indigo-500"
|
||||||
|
/>
|
||||||
|
<label for="remember-me" class="text-sm text-gray-600">Stay signed in for 30 days</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Form-level error -->
|
<!-- Form-level error -->
|
||||||
<div
|
<div
|
||||||
v-if="error"
|
v-if="error"
|
||||||
@@ -191,6 +202,7 @@ const totpInput = ref('')
|
|||||||
const backupCodeInput = ref('')
|
const backupCodeInput = ref('')
|
||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
const error = ref(null)
|
const error = ref(null)
|
||||||
|
const rememberMe = ref(false)
|
||||||
|
|
||||||
// Step: 'password' | 'totp' | 'backup'
|
// Step: 'password' | 'totp' | 'backup'
|
||||||
const step = ref('password')
|
const step = ref('password')
|
||||||
@@ -225,7 +237,7 @@ async function submitPassword() {
|
|||||||
loading.value = true
|
loading.value = true
|
||||||
error.value = null
|
error.value = null
|
||||||
try {
|
try {
|
||||||
const result = await authStore.login(email.value, password.value)
|
const result = await authStore.login(email.value, password.value, { rememberMe: rememberMe.value })
|
||||||
await handleLoginResult(result)
|
await handleLoginResult(result)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
error.value = e.message
|
error.value = e.message
|
||||||
@@ -240,6 +252,7 @@ async function submitTotp() {
|
|||||||
try {
|
try {
|
||||||
const result = await authStore.login(email.value, password.value, {
|
const result = await authStore.login(email.value, password.value, {
|
||||||
totpCode: totpInput.value,
|
totpCode: totpInput.value,
|
||||||
|
rememberMe: rememberMe.value,
|
||||||
})
|
})
|
||||||
await handleLoginResult(result)
|
await handleLoginResult(result)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -255,6 +268,7 @@ async function submitBackupCode() {
|
|||||||
try {
|
try {
|
||||||
const result = await authStore.login(email.value, password.value, {
|
const result = await authStore.login(email.value, password.value, {
|
||||||
backupCode: backupCodeInput.value,
|
backupCode: backupCodeInput.value,
|
||||||
|
rememberMe: rememberMe.value,
|
||||||
})
|
})
|
||||||
await handleLoginResult(result)
|
await handleLoginResult(result)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|||||||
Reference in New Issue
Block a user