Harden auth with revocable sessions, cookies, and single-login default.

Issue short-lived access JWTs backed by AuthSession rows, HttpOnly cookies with refresh rotation, idle timeout, session management UI, WebCRT ownership caps, and optional Redis login rate limits; new logins revoke other sessions by default.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
oliver 2026-08-06 14:13:37 +08:00
parent ba33ab5c4f
commit 20c2fcd496
34 changed files with 1462 additions and 149 deletions

View file

@ -16,7 +16,7 @@ export function ForceChangePasswordPage() {
const onSubmit = async (e: FormEvent) => {
e.preventDefault();
setError("");
if (newPassword.length < 6) {
if (newPassword.length < 8) {
setError(t("auth.passwordTooShort"));
return;
}
@ -77,7 +77,7 @@ export function ForceChangePasswordPage() {
onChange={(e) => setNewPassword(e.target.value)}
disabled={busy}
required
minLength={6}
minLength={8}
/>
</label>
<label className="login-card__label">
@ -90,7 +90,7 @@ export function ForceChangePasswordPage() {
onChange={(e) => setConfirm(e.target.value)}
disabled={busy}
required
minLength={6}
minLength={8}
/>
</label>
{error ? (