Sunucu doğrulaması
Aynı politikayı @virastack/password/server ile Server Action ve API route'larda çalıştırın.
Sunucu girişi
Tarayıcı atlanabilir; karar sunucudadır. validatePassword formla aynı motoru kullanır; aynı girdi iki tarafta aynı hataları verir. Kayıt, parola sıfırlama ve parola değiştirmede kullanın.
import { validatePassword } from "@virastack/password/server"
const result = validatePassword(formData.get("password"), policy, {
forbidden: [formData.get("email")],
confirm: formData.get("confirm"), // farklıysa password.mismatch ekler
})
// result.valid, result.issues, result.score, result.password (NFKC)String olmayan her şey (eksik alan, File) boş parola sayılır.
Server Action
// app/signup/actions.ts
"use server";
import { validatePassword } from "@virastack/password/server";
import type { PasswordIssue } from "@virastack/password/strength";
import { policy } from "@/lib/password-policy";
export type SignupState = { ok: boolean; issues: PasswordIssue[] } | null;
export async function signup(_state: SignupState, formData: FormData): Promise<SignupState> {
// The browser can be skipped; the server checks again with the same policy.
const result = validatePassword(formData.get("password"), policy, {
forbidden: [formData.get("email")],
confirm: formData.get("confirm"),
});
if (!result.valid) return { ok: false, issues: result.issues };
// await createUser(email, await hash(result.password)) — result.password is NFKC-normalized
return { ok: true, issues: [] };
}// app/api/password/route.ts
import { validatePassword } from "@virastack/password/server"
import { policy } from "@/lib/password-policy"
export async function POST(request: Request) {
const { password, email } = await request.json()
const result = validatePassword(password, policy, { forbidden: [email] })
return Response.json({ valid: result.valid, issues: result.issues })
}Neyi hash'lemeli
result.password değerini hash'leyin: NFKC ile normalleştirilmiştir; başka klavyede yazılan aynı parola girişte de doğrulanır. Giriş formundaki parolayı da normalizePassword ile aynı şekilde normalleştirin.
SSR ve Next.js
- Yalnızca
@virastack/passwordiçinde"use client"vardır. Server Component, Server Action ve route handler'lar/serverveya/strengthimport eder. - Politikayı
"use client"içermeyen ortak bir dosyada tutun. - Hook sunucuda ve istemcide aynı işaretlemeyi üretir (id'ler
useId'den gelir); hydration uyuşmazlığı olmaz. - Next.js ile
next devvenext startmodlarında test edildi.
