Skip to content

Commit ee43cc7

Browse files
chore: update translations and generated content (#1334)
Co-authored-by: wangsijie <5717882+wangsijie@users.noreply.github.com>
1 parent 883866f commit ee43cc7

File tree

18 files changed

+245
-118
lines changed

18 files changed

+245
-118
lines changed

i18n/de/docusaurus-plugin-content-docs/current/quick-starts/framework/next-app-router/README.mdx

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ import FetchOrganizationTokenForUser from './api-resources/_fetch-organization-t
2525

2626
## Voraussetzungen \{#prerequisites}
2727

28-
- Ein [Logto Cloud](https://cloud.logto.io)-Konto oder eine [selbst gehostete Logto](/introduction/set-up-logto-oss).
29-
- Eine erstellte traditionelle Logto-Anwendung.
28+
- Ein [Logto Cloud](https://cloud.logto.io) Konto oder ein [selbst gehostetes Logto](/introduction/set-up-logto-oss).
29+
- Eine erstellte Logto-Traditionelle Anwendung.
3030

3131
## Installation \{#installation}
3232

@@ -52,9 +52,10 @@ import FetchOrganizationTokenForUser from './api-resources/_fetch-organization-t
5252

5353
<FetchAccessTokenForApiResources />
5454

55-
Wenn du ein Zugangstoken im Server-Component abrufen musst, kannst du die Funktion `getAccessTokenRSC` verwenden:
55+
Wenn du ein Zugangstoken in der Server-Komponente abrufen musst, kannst du die Funktion `getAccessTokenRSC` verwenden:
5656

5757
```tsx title="app/page.tsx"
58+
// Beispiel: Zugangstoken im Server abrufen
5859
import { getAccessTokenRSC } from '@logto/next/server-actions';
5960
import { logtoConfig } from './logto';
6061

@@ -69,19 +70,25 @@ export default async function Home() {
6970
}
7071
```
7172

72-
:::tip
73+
:::tip[RSC-Token-Caching-Einschränkung]
74+
75+
React Server Components können keine Cookies schreiben (Next.js-Einschränkung). Während `getAccessTokenRSC` abgelaufene Tokens weiterhin mit dem Auffrischungstoken aktualisiert, wird das neue Zugangstoken nicht im Sitzungs-Cookie gespeichert. Das bedeutet, dass jede RSC-Anfrage eine Token-Aktualisierung auslösen kann, wenn das zwischengespeicherte Token abgelaufen ist.
7376

74-
HTTP erlaubt das Setzen von Cookies nach Beginn des Streamings nicht, daher kann `getAccessTokenRSC` den Cookie-Wert nicht aktualisieren. Wenn das Zugangstoken also aktualisiert wird, bleibt es nicht in der Sitzung erhalten. Es wird empfohlen, die Funktion `getAccessToken` auf der Client-Seite oder in Route-Handlern zu verwenden.
77+
**Lösungen:**
78+
79+
1. **Client-Komponenten mit Server Actions verwenden** – Rufe `getAccessToken` aus einer Client-Komponente über Server Actions auf, die Cookies aktualisieren können.
80+
2. **Externen Sitzungs-Speicher verwenden** – Konfiguriere einen `sessionWrapper` mit Redis/KV-Speicher. Das Cookie speichert nur eine feste Sitzungs-ID, während die Token-Daten im externen Speicher liegen, sodass RSC aktualisierte Tokens speichern kann. Siehe [Externen Sitzungs-Speicher verwenden](#use-external-session-storage) unten.
7581

7682
:::
7783

7884
### Organisationstokens abrufen \{#fetch-organization-tokens}
7985

8086
<FetchOrganizationTokenForUser />
8187

82-
Wenn du ein Organisationstoken im Server-Component abrufen musst, kannst du die Funktion `getOrganizationTokenRSC` verwenden:
88+
Wenn du ein Organisationstoken in der Server-Komponente abrufen musst, kannst du die Funktion `getOrganizationTokenRSC` verwenden:
8389

8490
```tsx title="app/page.tsx"
91+
// Beispiel: Organisationstoken im Server abrufen
8592
import { getOrganizationTokenRSC } from '@logto/next/server-actions';
8693
import { logtoConfig } from './logto';
8794

@@ -96,23 +103,24 @@ export default async function Home() {
96103
}
97104
```
98105

99-
:::tip
106+
:::tip[RSC-Token-Caching-Einschränkung]
100107

101-
HTTP erlaubt das Setzen von Cookies nach Beginn des Streamings nicht, daher kann `getOrganizationTokenRSC` den Cookie-Wert nicht aktualisieren. Wenn das Zugangstoken also aktualisiert wird, bleibt es nicht in der Sitzung erhalten. Es wird empfohlen, die Funktion `getOrganizationToken` auf der Client-Seite oder in Route-Handlern zu verwenden.
108+
Wie bei `getAccessTokenRSC` wird das aktualisierte Organisationstoken nicht in RSC gespeichert. Siehe [Lösungen oben](#fetch-access-token-for-the-api-resource).
102109

103110
:::
104111

105-
## Externen Sitzungspeicher verwenden \{#use-external-session-storage}
112+
## Externen Sitzungs-Speicher verwenden \{#use-external-session-storage}
106113

107114
<ExternalStorage />
108115

109-
## Automatische Weiterleitung zur Anmeldung bei fehlender Berechtigung \{#automatic-sign-in-redirect\}
116+
## Automatische Weiterleitung zur Anmeldung bei nicht autorisierten Zugriffen \{#automatic-sign-in-redirect\}
110117

111118
:::tip
112-
Der `signIn`-Helper ändert Cookies, um die Anmeldesitzung zu erstellen, daher kann er nicht direkt in einer React Server Component (RSC) aufgerufen werden. Um die Anmeldung automatisch auszulösen, wenn eine RSC einen nicht autorisierten Benutzer erkennt, rufe `signIn` in einem dedizierten Route-Handler auf und leite zu dieser Route weiter.
119+
Der `signIn`-Helper verändert Cookies, um die Anmeldesitzung zu erstellen, daher kann er nicht direkt in einer React Server Component (RSC) aufgerufen werden. Um die Anmeldung automatisch auszulösen, wenn eine RSC einen nicht autorisierten Benutzer erkennt, rufe `signIn` in einem dedizierten Route-Handler auf und leite zu dieser Route weiter.
113120
:::
114121

115122
```ts title="app/sign-in/route.ts"
123+
// Beispiel: Anmeldung über Route-Handler auslösen
116124
import { signIn } from '@logto/next/server-actions';
117125
import { logtoConfig } from '../../logto';
118126

@@ -122,6 +130,7 @@ export async function GET() {
122130
```
123131

124132
```tsx title="app/protected/page.tsx"
133+
// Beispiel: Automatische Weiterleitung bei nicht authentifiziertem Benutzer
125134
import { getLogtoContext } from '@logto/next/server-actions';
126135
import { redirect } from 'next/navigation';
127136
import { logtoConfig } from '../logto';
@@ -137,6 +146,6 @@ export default async function ProtectedPage() {
137146
}
138147
```
139148

140-
## Weiterführende Literatur \{#further-readings}
149+
## Weitere Informationen \{#further-readings}
141150

142151
<FurtherReadings />

i18n/de/docusaurus-plugin-content-docs/current/quick-starts/framework/next/_external-storage.mdx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Das SDK verwendet standardmäßig Cookies, um verschlüsselte Sitzungsdaten zu speichern. Dieser Ansatz ist sicher, erfordert keine zusätzliche Infrastruktur und funktioniert besonders gut in serverlosen Umgebungen wie Vercel.
22

3-
Es gibt jedoch Zeiten, in denen du Sitzungsdaten extern speichern musst. Zum Beispiel, wenn deine Sitzungsdaten zu groß für Cookies werden, insbesondere wenn du mehrere aktive Organisation-Sitzungen gleichzeitig aufrechterhalten musst. In diesen Fällen kannst du eine externe Sitzungspeicherung mit der Option `sessionWrapper` implementieren:
3+
Es gibt jedoch Situationen, in denen du Sitzungsdaten extern speichern musst. Zum Beispiel, wenn deine Sitzungsdaten zu groß für Cookies werden, insbesondere wenn du mehrere aktive Organisationstoken (Organization tokens) gleichzeitig verwalten musst. In diesen Fällen kannst du eine externe Sitzungspeicherung mit der Option `sessionWrapper` implementieren:
44

55
```ts
66
import { MemorySessionWrapper } from './storage';
@@ -18,9 +18,14 @@ import { type SessionWrapper, type SessionData } from '@logto/next';
1818

1919
export class MemorySessionWrapper implements SessionWrapper {
2020
private readonly storage = new Map<string, unknown>();
21+
private currentSessionId?: string;
2122

2223
async wrap(data: unknown, _key: string): Promise<string> {
23-
const sessionId = randomUUID();
24+
// Vorhandene Sitzungs-ID wiederverwenden, falls verfügbar; nur für Erstbenutzer eine neue generieren.
25+
// Dies ist wichtig für Umgebungen, in denen Cookies nicht aktualisiert werden können (z. B. React Server Components),
26+
// da die Sitzungs-ID im Cookie stabil bleiben muss, während die Daten im externen Speicher aktualisiert werden können.
27+
const sessionId = this.currentSessionId ?? randomUUID();
28+
this.currentSessionId = sessionId;
2429
this.storage.set(sessionId, data);
2530
return sessionId;
2631
}
@@ -30,10 +35,12 @@ export class MemorySessionWrapper implements SessionWrapper {
3035
return {};
3136
}
3237

38+
// Die Sitzungs-ID für eine mögliche Wiederverwendung in wrap() speichern
39+
this.currentSessionId = value;
3340
const data = this.storage.get(value);
3441
return data ?? {};
3542
}
3643
}
3744
```
3845

39-
Die obige Implementierung verwendet einen einfachen In-Memory-Speicher. In einer Produktionsumgebung möchtest du möglicherweise eine beständigere Speicherlösung verwenden, wie Redis oder eine Datenbank.
46+
Die obige Implementierung verwendet einen einfachen In-Memory-Speicher. In einer Produktionsumgebung solltest du eine beständigere Speicherlösung wie Redis oder eine Datenbank verwenden.

i18n/es/docusaurus-plugin-content-docs/current/quick-starts/framework/next-app-router/README.mdx

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,14 @@ export default async function Home() {
6969
}
7070
```
7171

72-
:::tip
72+
:::tip[Limitación de almacenamiento en caché de token en RSC]
73+
74+
Los React Server Components no pueden escribir cookies (limitación de Next.js). Aunque `getAccessTokenRSC` seguirá renovando los tokens expirados usando el token de actualización, el nuevo token de acceso no se guardará en la cookie de sesión. Esto significa que cada solicitud RSC puede desencadenar una renovación de token si el token en caché ha expirado.
7375

74-
HTTP no permite establecer cookies después de que comienza el streaming, `getAccessTokenRSC` no puede actualizar el valor de la cookie, por lo que si el token de acceso se actualiza, no se persistirá en la sesión. Se recomienda usar la función `getAccessToken` en el lado del cliente o en los manejadores de rutas.
76+
**Soluciones:**
77+
78+
1. **Usar componentes cliente con Server Actions** - Llama a `getAccessToken` desde un componente cliente mediante Server Actions, lo que puede actualizar las cookies.
79+
2. **Usar almacenamiento de sesión externo** - Configura un `sessionWrapper` con almacenamiento Redis/KV. La cookie almacena solo un ID de sesión fijo mientras que los datos del token viven en el almacenamiento externo, permitiendo que RSC persista los tokens renovados. Consulta [Usar almacenamiento de sesión externo](#use-external-session-storage) abajo.
7580

7681
:::
7782

@@ -96,9 +101,9 @@ export default async function Home() {
96101
}
97102
```
98103

99-
:::tip
104+
:::tip[Limitación de almacenamiento en caché de token en RSC]
100105

101-
HTTP no permite establecer cookies después de que comienza el streaming, `getOrganizationTokenRSC` no puede actualizar el valor de la cookie, por lo que si el token de acceso se actualiza, no se persistirá en la sesión. Se recomienda usar la función `getOrganizationToken` en el lado del cliente o en los manejadores de rutas.
106+
Al igual que `getAccessTokenRSC`, el token de organización renovado no se guardará en RSC. Consulta [las soluciones anteriores](#fetch-access-token-for-the-api-resource).
102107

103108
:::
104109

@@ -109,7 +114,7 @@ HTTP no permite establecer cookies después de que comienza el streaming, `getOr
109114
## Redirección automática al inicio de sesión en caso de no autorizado \{#automatic-sign-in-redirect\}
110115

111116
:::tip
112-
El helper `signIn` modifica las cookies para establecer la sesión de inicio de sesión, por lo que no puede ser invocado directamente en un React Server Component (RSC). Para activar el inicio de sesión automáticamente cuando un RSC detecta un usuario no autorizado, llama a `signIn` en un manejador de ruta dedicado y redirige a esa ruta.
117+
El helper `signIn` modifica las cookies para establecer la sesión de inicio de sesión, por lo que no puede invocarse directamente en un React Server Component (RSC). Para activar el inicio de sesión automáticamente cuando un RSC detecta un usuario no autorizado, llama a `signIn` en un manejador de ruta dedicado y redirige a esa ruta.
113118
:::
114119

115120
```ts title="app/sign-in/route.ts"

i18n/es/docusaurus-plugin-content-docs/current/quick-starts/framework/next/_external-storage.mdx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
El SDK utiliza cookies para almacenar datos de sesión cifrados por defecto. Este enfoque es seguro, no requiere infraestructura adicional y funciona especialmente bien en entornos sin servidor como Vercel.
1+
El SDK utiliza cookies para almacenar datos de sesión cifrados de forma predeterminada. Este enfoque es seguro, no requiere infraestructura adicional y funciona especialmente bien en entornos sin servidor como Vercel.
22

3-
Sin embargo, hay ocasiones en las que podrías necesitar almacenar los datos de sesión externamente. Por ejemplo, cuando tus datos de sesión crecen demasiado para las cookies, especialmente cuando necesitas mantener múltiples sesiones activas de organización simultáneamente. En estos casos, puedes implementar un almacenamiento de sesión externo utilizando la opción `sessionWrapper`:
3+
Sin embargo, hay ocasiones en las que podrías necesitar almacenar los datos de sesión externamente. Por ejemplo, cuando tus datos de sesión crecen demasiado para las cookies, especialmente cuando necesitas mantener varias sesiones activas de organización simultáneamente. En estos casos, puedes implementar almacenamiento externo de sesión utilizando la opción `sessionWrapper`:
44

55
```ts
66
import { MemorySessionWrapper } from './storage';
@@ -18,9 +18,14 @@ import { type SessionWrapper, type SessionData } from '@logto/next';
1818

1919
export class MemorySessionWrapper implements SessionWrapper {
2020
private readonly storage = new Map<string, unknown>();
21+
private currentSessionId?: string;
2122

2223
async wrap(data: unknown, _key: string): Promise<string> {
23-
const sessionId = randomUUID();
24+
// Reutiliza el ID de sesión existente si está disponible, solo genera uno nuevo para usuarios por primera vez.
25+
// Esto es importante para entornos donde las cookies no pueden actualizarse (por ejemplo, React Server Components),
26+
// ya que el ID de sesión en la cookie debe permanecer estable mientras que los datos en el almacenamiento externo pueden actualizarse.
27+
const sessionId = this.currentSessionId ?? randomUUID();
28+
this.currentSessionId = sessionId;
2429
this.storage.set(sessionId, data);
2530
return sessionId;
2631
}
@@ -30,10 +35,12 @@ export class MemorySessionWrapper implements SessionWrapper {
3035
return {};
3136
}
3237

38+
// Almacena el ID de sesión para posible reutilización en wrap()
39+
this.currentSessionId = value;
3340
const data = this.storage.get(value);
3441
return data ?? {};
3542
}
3643
}
3744
```
3845

39-
La implementación anterior utiliza un almacenamiento en memoria simple. En un entorno de producción, podrías querer usar una solución de almacenamiento más persistente, como Redis o una base de datos.
46+
La implementación anterior utiliza un almacenamiento simple en memoria. En un entorno de producción, podrías querer utilizar una solución de almacenamiento más persistente, como Redis o una base de datos.

i18n/fr/docusaurus-plugin-content-docs/current/quick-starts/framework/next-app-router/README.mdx

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,10 @@ import FetchOrganizationTokenForUser from './api-resources/_fetch-organization-t
5252

5353
<FetchAccessTokenForApiResources />
5454

55-
Si vous avez besoin de récupérer un jeton d’accès dans le composant serveur, vous pouvez utiliser la fonction `getAccessTokenRSC` :
55+
Si vous devez récupérer un jeton d’accès dans le composant serveur, vous pouvez utiliser la fonction `getAccessTokenRSC` :
5656

5757
```tsx title="app/page.tsx"
58-
// Importations et configuration identiques à l'exemple original
58+
// Importation des fonctions nécessaires
5959
import { getAccessTokenRSC } from '@logto/next/server-actions';
6060
import { logtoConfig } from './logto';
6161

@@ -70,20 +70,25 @@ export default async function Home() {
7070
}
7171
```
7272

73-
:::tip
73+
:::tip[Limitation du cache des jetons RSC]
74+
75+
Les React Server Components ne peuvent pas écrire de cookies (limitation Next.js). Bien que `getAccessTokenRSC` rafraîchisse toujours les jetons expirés à l’aide du jeton de rafraîchissement, le nouveau jeton d’accès ne sera pas conservé dans le cookie de session. Cela signifie que chaque requête RSC peut déclencher un rafraîchissement du jeton si le jeton mis en cache a expiré.
7476

75-
HTTP n’autorise pas la définition de cookies après le début du streaming, `getAccessTokenRSC` ne peut donc pas mettre à jour la valeur du cookie. Ainsi, si le jeton d’accès est rafraîchi, il ne sera pas conservé dans la session. Il est recommandé d’utiliser la fonction `getAccessToken` côté client ou dans les gestionnaires de routes.
77+
**Solutions :**
78+
79+
1. **Utiliser des composants client avec Server Actions** – Appelez `getAccessToken` depuis un composant client via Server Actions, ce qui permet de mettre à jour les cookies.
80+
2. **Utiliser un stockage de session externe** – Configurez un `sessionWrapper` avec un stockage Redis/KV. Le cookie ne stocke qu’un identifiant de session fixe tandis que les données de jeton résident dans le stockage externe, permettant à RSC de conserver les jetons rafraîchis. Voir [Utiliser un stockage de session externe](#use-external-session-storage) ci-dessous.
7681

7782
:::
7883

7984
### Récupérer des jetons d’organisation \{#fetch-organization-tokens}
8085

8186
<FetchOrganizationTokenForUser />
8287

83-
Si vous avez besoin de récupérer un jeton d’organisation dans le composant serveur, vous pouvez utiliser la fonction `getOrganizationTokenRSC` :
88+
Si vous devez récupérer un jeton d’organisation dans le composant serveur, vous pouvez utiliser la fonction `getOrganizationTokenRSC` :
8489

8590
```tsx title="app/page.tsx"
86-
// Importations et configuration identiques à l'exemple original
91+
// Importation des fonctions nécessaires
8792
import { getOrganizationTokenRSC } from '@logto/next/server-actions';
8893
import { logtoConfig } from './logto';
8994

@@ -98,24 +103,24 @@ export default async function Home() {
98103
}
99104
```
100105

101-
:::tip
106+
:::tip[Limitation du cache des jetons RSC]
102107

103-
HTTP n’autorise pas la définition de cookies après le début du streaming, `getOrganizationTokenRSC` ne peut donc pas mettre à jour la valeur du cookie. Ainsi, si le jeton d’accès est rafraîchi, il ne sera pas conservé dans la session. Il est recommandé d’utiliser la fonction `getOrganizationToken` côté client ou dans les gestionnaires de routes.
108+
Comme pour `getAccessTokenRSC`, le jeton d’organisation rafraîchi ne sera pas conservé dans RSC. Voir [solutions ci-dessus](#fetch-access-token-for-the-api-resource).
104109

105110
:::
106111

107112
## Utiliser un stockage de session externe \{#use-external-session-storage}
108113

109114
<ExternalStorage />
110115

111-
## Redirection automatique vers la connexion en cas d’accès non autorisé \{#automatic-sign-in-redirect\}
116+
## Redirection automatique vers la connexion en cas d’utilisateur non autorisé \{#automatic-sign-in-redirect\}
112117

113118
:::tip
114119
Le helper `signIn` modifie les cookies pour établir la session de connexion, il ne peut donc pas être invoqué directement dans un React Server Component (RSC). Pour déclencher automatiquement la connexion lorsqu’un RSC détecte un utilisateur non autorisé, appelez `signIn` dans un gestionnaire de route dédié et redirigez vers cette route.
115120
:::
116121

117122
```ts title="app/sign-in/route.ts"
118-
// Importations et configuration identiques à l'exemple original
123+
// Importation des fonctions nécessaires
119124
import { signIn } from '@logto/next/server-actions';
120125
import { logtoConfig } from '../../logto';
121126

@@ -125,7 +130,7 @@ export async function GET() {
125130
```
126131

127132
```tsx title="app/protected/page.tsx"
128-
// Importations et configuration identiques à l'exemple original
133+
// Importation des fonctions nécessaires
129134
import { getLogtoContext } from '@logto/next/server-actions';
130135
import { redirect } from 'next/navigation';
131136
import { logtoConfig } from '../logto';

0 commit comments

Comments
 (0)