Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions src/content/docs/es/guides/actions.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -331,14 +331,14 @@ export const server = {
// Coincide cuando el campo `type` tiene el valor `create`
type: z.literal('create'),
name: z.string(),
email: z.string().email(),
email: z.email(),
}),
z.object({
// Coincide cuando el campo `type` tiene el valor `update`
type: z.literal('update'),
id: z.number(),
name: z.string(),
email: z.string().email(),
email: z.email(),
}),
]),
async handler(input) {
Expand Down Expand Up @@ -376,7 +376,7 @@ El siguiente ejemplo muestra un formulario validado para la suscripción a un ne
</form>
```

2. Define una acción `newsletter` para manejar el formulario enviado. Valida el campo `email` usando el validador `z.string().email()`, y la casilla `terms` con `z.boolean()`:
2. Define una acción `newsletter` para manejar el formulario enviado. Valida el campo `email` usando el validador `z.email()`, y la casilla `terms` con `z.boolean()`:

```ts title="src/actions/index.ts" ins={5-12}
import { defineAction } from 'astro:actions';
Expand All @@ -386,7 +386,7 @@ El siguiente ejemplo muestra un formulario validado para la suscripción a un ne
newsletter: defineAction({
accept: 'form',
input: z.object({
email: z.string().email(),
email: z.email(),
terms: z.boolean(),
}),
handler: async ({ email, terms }) => { /* ... */ },
Expand Down Expand Up @@ -703,7 +703,7 @@ export const onRequest = defineMiddleware(async (context, next) => {

## Seguridad al usar acciones

Las acciones son accesibles como endpoints públicos basados en el nombre de la acción. Por ejemplo, la acción `blog.like()` será accesible desde `/_actions/blog.like`. Esto es útil para realizar pruebas unitarias de los resultados de la acción y para depurar errores en producción. Sin embargo, esto significa que **debes** implementar las mismas verificaciones de autorización que considerarías para los endpoints de API y las páginas renderizadas bajo demanda.
Las acciones son accesibles como endpoints públicos basados en el nombre de la acción. Por ejemplo, la acción `blog.like()` será accesible desde `/_actions/blog.like`. Esto es útil para realizar pruebas unitarias de los resultados de la acción y para depurar errores en producción. Sin embargo, esto significa que **debes** usar las mismas verificaciones de autorización que considerarías para los endpoints de API y las páginas renderizadas bajo demanda.

### Autorizar usuarios desde un handler de acción

Expand Down Expand Up @@ -739,20 +739,20 @@ Usa la función `getActionContext()` en tu middleware para obtener información
El siguiente ejemplo rechaza todas las solicitudes de acción que no tengan un token de sesión válido. Si la verificación falla, se devuelve una respuesta de "Forbidden". Nota: este método asegura que las acciones solo sean accesibles cuando hay una sesión presente, pero *no* es un sustituto para una autorización segura.

```ts title="src/middleware.ts"
import { defineMiddleware } from 'astro:middleware';
import { getActionContext } from 'astro:actions';
import { defineMiddleware } from "astro:middleware";
import { getActionContext } from "astro:actions";

export const onRequest = defineMiddleware(async (context, next) => {
const { action } = getActionContext(context);
// Verificar si la acción fue llamada desde una función del lado del cliente
if (action?.calledFrom === 'rpc') {
if (action?.calledFrom === "rpc") {
// Si es así, verifica que exista un token de sesión de usuario
if (!context.cookies.has('user-session')) {
return new Response('Forbidden', { status: 403 });
if (!context.cookies.has("user-session")) {
return new Response("Forbidden", { status: 403 });
}
}

context.cookies.set('user-session', /* token de sesión */);
context.cookies.set("user-session", "session-token-value");
return next();
});
```
Expand Down
Loading