Fase 3 (islas): cambiar contraseña y token de seguridad en React/TSX

Ambas vistas ya devolvían JSON en POST y exigen sesión, así que sin cambio de backend:

- ChangePasswordForm.tsx: 4 campos (actual/nueva/confirmar/token) con mostrar-ocultar;
  POST form-urlencoded + CSRF a change_password; mensaje HTML; si el backend responde
  redirect:true (logout por seguridad), redirige a login.
- SecurityTokenForm.tsx: muestra la fecha del token y un botón que solicita uno nuevo;
  POST -> actualiza la fecha con token_date de la respuesta.
- Plantillas: los <form> + scripts jQuery se sustituyen por las islas
  (#change-password-app / #security-token-app) con data-csrf/data-url. El texto
  informativo y los enlaces se quedan en Django.

Verificado: check OK; ambas vistas siguen redirigiendo a login/index sin sesión.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-12 21:26:30 +00:00
parent b2069df4c3
commit d0febb4855
7 changed files with 220 additions and 39 deletions
+16
View File
@@ -0,0 +1,16 @@
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import { ChangePasswordForm } from '../components/ChangePasswordForm'
const el = document.getElementById('change-password-app')
if (el) {
createRoot(el).render(
<StrictMode>
<ChangePasswordForm
url={el.dataset.url || ''}
csrfToken={el.dataset.csrf || ''}
loginUrl={el.dataset.loginUrl || '/es/log-in/'}
/>
</StrictMode>,
)
}
+16
View File
@@ -0,0 +1,16 @@
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import { SecurityTokenForm } from '../components/SecurityTokenForm'
const el = document.getElementById('security-token-app')
if (el) {
createRoot(el).render(
<StrictMode>
<SecurityTokenForm
url={el.dataset.url || ''}
csrfToken={el.dataset.csrf || ''}
initialDate={el.dataset.tokenDate || 'Sin solicitar'}
/>
</StrictMode>,
)
}