Kundenbereich: Passwort selbst ändern
Im Konto-Menü (Profilbild) gibt es unter "Konto" jetzt "Passwort ändern". Die Seite fragt aktuelles Passwort, neues Passwort und Wiederholung ab (mindestens 8 Zeichen, "Passwörter anzeigen"). Am Handy ist sie eine Unterseite des Tabs, aus dem man kam; Direktlink /dashboard.html#passwort. Im Ansichtsmodus ist sie gesperrt. Server (POST /api/auth/password): - Das aktuelle Passwort wird über eine kurze Appwrite-Session geprüft, die gleich wieder gelöscht wird. Tippfehler lösen nicht die globale Login-Sperre aus. Es gibt höchstens 5 Prüfungen je Kunde und Stunde, das bleibt unter Appwrites Grenze (10 Anmeldungen je E-Mail und Stunde). - Das neue Passwort wird über die Users-API gesetzt. Fehler von Appwrite (zuletzt benutzt, zu häufig, persönliche Daten) kommen als verständliche Meldung. - Die Klartext-Kopie in customers.portalPassword und ein Alt-Eintrag in den Notizen werden geleert. Ein selbst gewähltes Passwort wird nie im Klartext gespeichert; das Ticketsystem zeigt dann "–". - Der Kunde bekommt eine Bestätigungsmail (Kopie an die Admins wie bei allen Kundenmails). Andere Geräte werden abgemeldet: Kunden-Sessions merken sich beim Login den Passwortstand (Appwrite passwordUpdate, pwv). requireSession und /api/auth/me prüfen ihn, 60 s zwischengespeichert. Das gilt auch, wenn wir im Ticketsystem ein neues Passwort setzen. Ist Appwrite nicht erreichbar, bleibt die Session gültig. Sessions von vor diesem Update haben keinen Stand und laufen normal aus (höchstens 7 Tage). Login-Seite: Hinweis auf "Passwort ändern" statt "über das Ticketsystem", dazu "Passwort vergessen?" mit support@webklar.com. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
63ddbf55cc
commit
81119c19bc
12 files changed
+585
-13
No files matched your search
@@ -13,6 +13,7 @@ import {
|
||||
updateDocument,
|
||||
Query,
|
||||
} from './appwriteAdmin.js'
|
||||
import { forgetPasswordVersion } from './passwordVersion.js'
|
||||
|
||||
function readPortalPassword(customer) {
|
||||
if (customer?.portalPassword) return customer.portalPassword
|
||||
@@ -192,6 +193,8 @@ export async function updateCustomerWithPortalAccess(customerId, payload) {
|
||||
}
|
||||
if (normalizedPassword) {
|
||||
await updateAppwriteUserPassword(appwriteUserId, normalizedPassword)
|
||||
// Neues Passwort von uns: der Kunde ist auf allen Geraeten abgemeldet (passwordVersion.js)
|
||||
forgetPasswordVersion(appwriteUserId)
|
||||
portalPassword = normalizedPassword
|
||||
}
|
||||
} else if (normalizedPassword) {
|
||||
@@ -235,6 +238,24 @@ export async function updateCustomerWithPortalAccess(customerId, payload) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Der Kunde hat sein Passwort im Kundenbereich selbst geaendert: die Klartext-Kopie, die das
|
||||
* Ticketsystem zum Weitergeben anzeigt, stimmt nicht mehr. Sie wird geleert statt ueberschrieben,
|
||||
* denn ein selbst gewaehltes Passwort gehoert nirgends im Klartext hin. Das Ticketsystem zeigt dann "–".
|
||||
* @returns {Promise<boolean>} true, wenn eine Kopie entfernt wurde
|
||||
*/
|
||||
export async function forgetStoredPortalPassword(customerId) {
|
||||
const customer = await getDocument(config.collections.customers, customerId)
|
||||
const legacyInNotes = /^__portalPassword__:/.test(customer.notes || '')
|
||||
if (!customer.portalPassword && !legacyInNotes) return false
|
||||
await updateDocument(config.collections.customers, customerId, {
|
||||
portalPassword: '',
|
||||
...(legacyInNotes ? { notes: notesWithoutPortalPassword(customer.notes) } : {}),
|
||||
updatedAt: new Date().toISOString(),
|
||||
})
|
||||
return true
|
||||
}
|
||||
|
||||
export async function listCustomersForAdmin() {
|
||||
// Ohne Limit liefert Appwrite nur 25 Dokumente - neue Kunden fielen dann aus der Liste.
|
||||
const customers = await listDocuments(config.collections.customers, [
|
||||
|
||||
Reference in new issue
Block a user