>
)}
@@ -281,15 +277,15 @@ function PushNotificationManager() {
}
if (!isSupported) {
- return
-
Push Notifications
+
プッシュ通知
{subscription ? (
<>
-
プッシュ通知に購読しています。
+
プッシュ通知を購読しています。
setMessage(e.target.value)}
/>
-
+
>
) : (
<>
-
プッシュ通知に購読していません。
+
プッシュ通知を購読していません。
>
)}
@@ -310,7 +306,7 @@ function PushNotificationManager() {
}
```
-最後に、iOSデバイス向けにホーム画面に追加するためのメッセージを表示するコンポーネントを作成します。このメッセージは、アプリがすでにインストールされている場合には表示されないようにします。
+最後に、iOSデバイス用にホーム画面にインストールを指示するメッセージを表示し、アプリがすでにインストールされている場合にはこれを表示しないコンポーネントを作成します。
```tsx switcher
function InstallPrompt() {
@@ -326,7 +322,7 @@ function InstallPrompt() {
}, [])
if (isStandalone) {
- return null // すでにインストールされている場合はインストールボタンを表示しない
+ return null // すでにインストールされている場合、インストールボタンを表示しない
}
return (
@@ -335,13 +331,13 @@ function InstallPrompt() {
{isIOS && (
- このアプリをiOSデバイスにインストールするには、共有ボタン
-
+ iOSデバイスにこのアプリをインストールするには、共有ボタンを
+
{' '}
⎋{' '}
- をタップし、「ホーム画面に追加」
-
+ タップして「ホーム画面に追加」
+
{' '}
➕{' '}
@@ -376,7 +372,7 @@ function InstallPrompt() {
}, []);
if (isStandalone) {
- return null; // すでにインストールされている場合はインストールボタンを表示しない
+ return null; // すでにインストールされている場合、インストールボタンを表示しない
}
return (
@@ -385,13 +381,13 @@ function InstallPrompt() {
{isIOS && (
- このアプリをiOSデバイスにインストールするには、共有ボタン
-
+ iOSデバイスにこのアプリをインストールするには、共有ボタンを
+
{' '}
⎋{' '}
- をタップし、「ホーム画面に追加」
-
+ タップして「ホーム画面に追加」
+
{' '}
➕{' '}
@@ -412,11 +408,11 @@ export default function Page() {
}
```
-次に、これが呼び出すServer Actionsを作成します。
+次に、これらのファイルが呼び出すServer Actionsを作成します。
-### 3. Server Actionsの実装 {#3-implementing-server-actions}
+### 3. サーバーアクションの実装 {#3-implementing-server-actions}
-`app/actions.ts`にアクションを含める新しいファイルを作成します。このファイルは、購読の作成、削除、および通知の送信を処理します。
+`app/actions.ts`にアクションを含める新しいファイルを作成します。このファイルは、購読の作成、購読の削除、および通知の送信を処理します。
@@ -434,26 +430,23 @@ webpush.setVapidDetails(
let subscription: PushSubscription | null = null
-// ユーザーを購読させる関数
export async function subscribeUser(sub: PushSubscription) {
subscription = sub
- // 本番環境では購読情報をデータベースに保存することをお勧めします
- // 例: await db.subscriptions.create({ data: sub })
+ // 本番環境では、購読をデータベースに保存することをお勧めします
+ // 例えば: await db.subscriptions.create({ data: sub })
return { success: true }
}
-// ユーザーの購読を解除する関数
export async function unsubscribeUser() {
subscription = null
- // 本番環境ではデータベースから購読情報を削除することをお勧めします
- // 例: await db.subscriptions.delete({ where: { ... } })
+ // 本番環境では、データベースから購読を削除することをお勧めします
+ // 例えば: await db.subscriptions.delete({ where: { ... } })
return { success: true }
}
-// 通知を送信する関数
export async function sendNotification(message: string) {
if (!subscription) {
- throw new Error('利用可能な購読がありません')
+ throw new Error('購読が利用できません')
}
try {
@@ -467,7 +460,7 @@ export async function sendNotification(message: string) {
)
return { success: true }
} catch (error) {
- console.error('プッシュ通知の送信エラー:', error)
+ console.error('プッシュ通知の送信中にエラーが発生しました:', error)
return { success: false, error: '通知の送信に失敗しました' }
}
}
@@ -489,26 +482,23 @@ webpush.setVapidDetails(
let subscription= null;
-// ユーザーを購読させる関数
export async function subscribeUser(sub) {
subscription = sub;
- // 本番環境では購読情報をデータベースに保存することをお勧めします
- // 例: await db.subscriptions.create({ data: sub })
+ // 本番環境では、購読をデータベースに保存することをお勧めします
+ // 例えば: await db.subscriptions.create({ data: sub })
return { success: true };
}
-// ユーザーの購読を解除する関数
export async function unsubscribeUser() {
subscription = null;
- // 本番環境ではデータベースから購読情報を削除することをお勧めします
- // 例: await db.subscriptions.delete({ where: { ... } })
+ // 本番環境では、データベースから購読を削除することをお勧めします
+ // 例えば: await db.subscriptions.delete({ where: { ... } })
return { success: true };
}
-// 通知を送信する関数
export async function sendNotification(message) {
if (!subscription) {
- throw new Error('利用可能な購読がありません');
+ throw new Error('購読が利用できません');
}
try {
@@ -522,7 +512,7 @@ export async function sendNotification(message) {
);
return { success: true };
} catch (error) {
- console.error('プッシュ通知の送信エラー:', error);
+ console.error('プッシュ通知の送信中にエラーが発生しました:', error);
return { success: false, error: '通知の送信に失敗しました' };
}
}
@@ -533,35 +523,34 @@ export async function sendNotification(message) {
通知の送信は、ステップ5で作成したサービスワーカーによって処理されます。
-本番環境では、サーバー再起動時の永続性や複数のユーザーの購読を管理するために、データベースに購読情報を保存することをお勧めします。
+本番環境では、サーバーの再起動や複数のユーザーの購読管理のために、購読をデータベースに保存することをお勧めします。
### 4. VAPIDキーの生成 {#4-generating-vapid-keys}
-WebプッシュAPIを使用するには、[VAPID](https://vapidkeys.com/)キーを生成する必要があります。
+WebプッシュAPIを使用するには、[VAPID](https://vapidkeys.com/)キーを生成する必要があります。最も簡単な方法は、web-push CLIを直接使用することです:
-スクリプトファイルを作成します。例:`generate-vapid-keys.js`:
+まず、web-pushをグローバルにインストールします:
-```js title="./generate-vapid-keys.js"
-const webpush = require('web-push')
-const vapidKeys = webpush.generateVAPIDKeys()
-
-console.log('以下のキーを.envファイルに貼り付けてください:')
-console.log('-------------------')
-console.log('NEXT_PUBLIC_VAPID_PUBLIC_KEY=', vapidKeys.publicKey)
-console.log('VAPID_PRIVATE_KEY=', vapidKeys.privateKey)
+```bash title="Terminal"
+npm install -g web-push
```
-このスクリプトをNode.jsで実行してVAPIDキーを生成します:
+次に、以下のコマンドを実行してVAPIDキーを生成します:
```bash title="Terminal"
-node generate-vapid-keys.js
+web-push generate-vapid-keys
```
-出力をコピーして、`.env`ファイルに貼り付けます。
+出力をコピーして、キーを`.env`ファイルに貼り付けます:
+
+```.env
+NEXT_PUBLIC_VAPID_PUBLIC_KEY=your_public_key_here
+VAPID_PRIVATE_KEY=your_private_key_here
+```
### 5. サービスワーカーの作成 {#5-creating-a-service-worker}
-サービスワーカー用の`public/sw.js`ファイルを作成します:
+サービスワーカー用に`public/sw.js`ファイルを作成します:
```js title="public/sw.js"
self.addEventListener('push', function (event) {
@@ -582,45 +571,45 @@ self.addEventListener('push', function (event) {
})
self.addEventListener('notificationclick', function (event) {
- console.log('通知クリックを受け取りました。')
+ console.log('通知のクリックが受信されました。')
event.notification.close()
- event.waitUntil(clients.openWindow(''))
+ event.waitUntil(clients.openWindow('https://your-website.com'))
})
```
-このサービスワーカーは、カスタム画像と通知をサポートしています。受信プッシュイベントと通知のクリックを処理します。
+このサービスワーカーはカスタム画像と通知をサポートしています。送信されるプッシュイベントと通知クリックを処理します。
-- `icon`や`badge`プロパティを使用して通知用のカスタムアイコンを設定できます。
-- `vibrate`パターンを調整して、サポートされているデバイスでカスタムバイブレーションアラートを作成できます。
-- `data`プロパティを使用して通知に追加のデータを添付できます。
+- 通知用に`icon`と`badge`プロパティを使用してカスタムアイコンを設定できます。
+- `vibrate`パターンは、対応するデバイスでカスタム振動アラートを作成するために調整可能です。
+- `data`プロパティを使用して通知に追加のデータを付加することができます。
-さまざまなデバイスとブラウザーで期待どおりに動作することを確認するために、サービスワーカーを徹底的にテストしましょう。また、`notificationclick`イベントリスナー内の`'https://your-website.com'`リンクをアプリケーションに適したURLに更新してください。
+サービスワーカーが異なるデバイスおよびブラウザで期待通りに動作することを確認するために、徹底的にテストを行いましょう。また、`notificationclick`イベントリスナー内の`'https://your-website.com'`リンクをアプリケーションに適したURLに更新するのを忘れないでください。
### 6. ホーム画面への追加 {#6-adding-to-home-screen}
-ステップ2で定義した`InstallPrompt`コンポーネントは、iOSデバイスにホーム画面に追加するためのメッセージを表示します。
+ステップ2で定義された`InstallPrompt`コンポーネントは、iOSデバイス用にホーム画面にインストールするように指示するメッセージを表示します。
-モバイルのホーム画面にアプリケーションをインストールできるようにするためには、以下が必要です:
+モバイルホームスクリーンにインストール可能なアプリケーションを確保するために、以下が必要です:
-1. 有効なweb app manifest(ステップ1で作成したもの)
+1. 有効なウェブアプリマニフェスト(ステップ1で作成)
2. HTTPSで提供されるウェブサイト
-これらの条件が満たされた場合、最新のブラウザは自動的にユーザーにインストールの プロンプトを表示します。[`beforeinstallprompt`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeinstallprompt_event)を使用してカスタムインストールボタンを提供することもできますが、これはSafari iOSでは機能しないため、クロスブラウザおよびプラットフォームには推奨しません。
+これらの基準を満たすと、現代のブラウザは自動的にユーザーにインストールプロンプトを表示します。[`beforeinstallprompt`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeinstallprompt_event)を使用してカスタムインストールボタンを提供することもできますが、これはSafari iOSでは動作せず、クロスブラウザおよびプラットフォームに対応していないため、お勧めしません。
-### 7. ローカルテスト {#7-testing-locally}
+### 7. ローカルでのテスト {#7-testing-locally}
-ローカルで通知を表示できることを確認するために、以下を確認してください:
+ローカルで通知を確認するために、以下を確認してください:
-- [HTTPSでローカルで実行](/docs/app/api-reference/cli/next#using-https-during-development)する
- - テスト用に`next dev --experimental-https`を使用
-- ブラウザ(Chrome, Safari, Firefox)で通知が有効になっている
- - ローカルでプロンプトが表示された際に、通知の使用を許可
+- [HTTPSでローカル実行しています](/docs/app/api-reference/cli/next#using-https-during-development)
+ - テストのために `next dev --experimental-https` を使用
+- 使用中のブラウザ(Chrome、Safari、Firefox)に通知が有効になっている
+ - ローカルでプロンプトが表示されたら、通知を使用するための許可を承諾
- ブラウザ全体で通知が無効になっていないことを確認
- - それでも通知が表示されない場合は、別のブラウザを使用してデバッグ
+ - それでも通知が表示されない場合は、デバッグのために別のブラウザを試してみてください
-### 8. アプリケーションのセキュリティ {#8-securing-your-application}
+### 8. アプリケーションのセキュリティ確保 {#8-securing-your-application}
-セキュリティは、特にPWAにおけるWebアプリケーションの重要な側面です。Next.jsでは`next.config.js`ファイルを使用してセキュリティヘッダーを設定できます。例:
+セキュリティは、特にPWAにとって重要なウェブアプリケーションの側面です。 Next.jsでは、`next.config.js`ファイルを使ってセキュリティヘッダーを構成できます。例として以下を示します:
```js title="next.config.js"
module.exports = {
@@ -665,23 +654,23 @@ module.exports = {
}
```
-それぞれのオプションについて説明します:
+これらのオプションを詳しく見てみましょう:
1. グローバルヘッダー(すべてのルートに適用):
- 1. `X-Content-Type-Options: nosniff`:MIMEタイプのスニッフィングを防ぎ、悪意のあるファイルアップロードのリスクを減少。
- 2. `X-Frame-Options: DENY`:クリックジャッキング攻撃から保護し、サイトがiframeに埋め込まれるのを防止。
- 3. `Referrer-Policy: strict-origin-when-cross-origin`:リファラー情報を含むリクエストの制御、セキュリティと機能性のバランス。
-2. サービスワーカー専用ヘッダー:
- 1. `Content-Type: application/javascript; charset=utf-8`:サービスワーカーがJavaScriptとして正しく解釈されることを保証。
- 2. `Cache-Control: no-cache, no-store, must-revalidate`:サービスワーカーのキャッシングを防ぎ、ユーザーが常に最新のバージョンを取得することを保証。
- 3. `Content-Security-Policy: default-src 'self'; script-src 'self'`:サービスワーカーに対する厳格なコンテンツセキュリティポリシーを実装、同一のオリジンからのスクリプトのみを許可。
+ 1. `X-Content-Type-Options: nosniff`: MIMEタイプをスニッフィングを防ぎ、悪意のあるファイルアップロードのリスクを減少させます。
+ 2. `X-Frame-Options: DENY`: クリックジャック攻撃から保護し、サイトがiframeで埋め込まれるのを防ぎます。
+ 3. `Referrer-Policy: strict-origin-when-cross-origin`: リクエストに含まれるリファラー情報の制御、セキュリティと機能性のバランスを取ります。
+2. サービスワーカー専用のヘッダー:
+ 1. `Content-Type: application/javascript; charset=utf-8`: サービスワーカーがJavaScriptとして正しく解釈されるようにします。
+ 2. `Cache-Control: no-cache, no-store, must-revalidate`: サービスワーカーのキャッシュを防ぎ、ユーザーが常に最新バージョンを受け取るようにします。
+ 3. `Content-Security-Policy: default-src 'self'; script-src 'self'`: サービスワーカー用の厳格なコンテンツセキュリティポリシーを実施し、同一オリジンからのみスクリプトを許可します。
-Next.jsを用いて[コンテンツセキュリティポリシーを定義](/docs/app/building-your-application/configuring/content-security-policy)について学びましょう。
+Next.jsを用いた[コンテンツセキュリティポリシーの定義](/docs/app/building-your-application/configuring/content-security-policy)について詳しく学びましょう。
## 次のステップ {#next-steps}
-1. **PWAの機能を探求する**:PWAは、さまざまなWeb APIを活用して高度な機能を提供できます。アプリケーションを強化するために、バックグラウンド同期、定期的なバックグラウンド同期、またはファイルシステムアクセスAPIなどの機能を探求してください。PWA機能についての最新情報は、[What PWA Can Do Today](https://whatpwacando.today/)などのリソースを参照。
-2. **静的エクスポート**:サーバーを実行せずに静的なファイルのエクスポートを使用する必要がある場合、Next.jsの設定を更新してこの変更を実現できます。詳細は[Next.js Static Export ドキュメント](/docs/app/building-your-application/deploying/static-exports)を参照してください。ただし、Server Actionsから外部APIの呼び出しおよび定義されたヘッダーをプロキシに移行する必要があります。
-3. **オフラインサポート**:オフライン機能を提供するオプションとして、Next.jsと共に[Serwist](https://github.com/serwist/serwist)を使用できます。Next.jsとの統合方法の例は、[Serwist ドキュメント](https://github.com/serwist/serwist/tree/main/examples/next-basic)で確認できます。**注:**このプラグインは現在、webpackの設定が必要です。
-4. **セキュリティの考慮事項**:サービスワーカーが適切に保護されていることを確認してください。これには、HTTPSの使用、プッシュメッセージの送信元の検証、適切なエラーハンドリングの実装が含まれます。
-5. **ユーザーエクスペリエンス**:ユーザーのブラウザが特定のPWA機能をサポートしていない場合でもアプリが正常に動作するよう、プログレッシブエンハンスメント技術を検討してください。
+1. **PWA機能の探求**: PWAはさまざまなWeb APIを利用して高度な機能を提供できます。バックグラウンド同期、定期バックグラウンド同期、またはファイルシステムアクセスAPIのような機能を探求し、アプリケーションを強化しましょう。 PWA能力のインスピレーションと最新情報については、[What PWA Can Do Today](https://whatpwacando.today/)のリソースを参照できます。
+2. **静的エクスポート**:アプリケーションがサーバーを実行する必要がなく、代わりに静的ファイルのエクスポートを使用する場合、Next.js構成を更新してこの変更を有効にできます。 [Next.js 静的エクスポートのドキュメント](/docs/app/building-your-application/deploying/static-exports)で詳細を学べます。ただし、サーバーアクションから外部APIの呼び出し、定義されたヘッダーをプロキシに移行する必要があります。
+3. **オフラインサポート**:オフライン機能を提供するための一つのオプションは、Next.jsと[Serwist](https://github.com/serwist/serwist)です。SerwistとNext.jsを統合する方法の例を、彼らの[ドキュメント](https://github.com/serwist/serwist/tree/main/examples/next-basic)で見つけることができます。 **注意**:このプラグインは現在webpackの設定を必要とします。
+4. **セキュリティの考慮**:サービスワーカーが適切に保護されていることを確認しましょう。これにはHTTPSの使用、プッシュメッセージのソースの検証、適切なエラーハンドリングの実装が含まれます。
+5. **ユーザーエクスペリエンス**: 一部のPWA機能がユーザーのブラウザでサポートされていない場合でもアプリが問題なく機能するように、プログレッシブエンハンスメント技術の実装を検討してください。
diff --git a/docs/01-app/02-building-your-application/09-authentication/index.mdx b/docs/01-app/02-building-your-application/09-authentication/index.mdx
index 3bbf5ea..1b0c7a9 100644
--- a/docs/01-app/02-building-your-application/09-authentication/index.mdx
+++ b/docs/01-app/02-building-your-application/09-authentication/index.mdx
@@ -1,43 +1,43 @@
---
title: '認証'
-description: 'Next.jsアプリケーションで認証を実装する方法を学びます。'
+description: 'Next.js アプリケーションでの認証の実装方法を学びます。'
---
-認証を理解することは、アプリケーションのデータを保護するために重要です。この記事では、認証を実装するためにReactとNext.jsの機能をどのように使用するかについて説明します。
+アプリケーションのデータを保護するために、認証を理解することは極めて重要です。このページでは、React と Next.js の機能を利用して認証を実装する方法を説明します。
-始める前に、プロセスを次の3つの概念に分解すると役立ちます:
+始める前に、このプロセスを3つの概念に分解することが役立ちます:
-1. **[認証](#authentication)**:ユーザーが主張する人物であるかどうかを検証します。ユーザーがユーザー名やパスワードなどのもので自分の身元を証明することが必要です。
-2. **[セッション管理](#session-management)**:リクエスト間のユーザーの認証状態を追跡します。
-3. **[認可](#authorization)**:ユーザーがどのルートとデータにアクセスできるかを決定します。
+1. **[認証](#authentication)**: ユーザーが本当に自身が主張する人であるかを確認します。それは、ユーザーがユーザー名やパスワードなど手持ちのもので身元を証明する必要があります。
+2. **[セッション管理](#session-management)**: リクエスト全体を通じてユーザーの認証状態を追跡します。
+3. **[認可](#authorization)**: ユーザーがアクセスできるルートやデータを決定します。
-次の図は、ReactおよびNext.jsの機能を使用した認証フローを示しています:
+この図は、React と Next.js の機能を使用した認証フローを示しています:
-この記事の例では、教育的目的で基本的なユーザー名とパスワードの認証を説明しています。カスタムの認証ソリューションを実装することもできますが、セキュリティの向上とシンプルさのために、認証ライブラリの使用をお勧めします。これらは、認証、セッション管理、および認可のための組み込みソリューションに加えて、ソーシャルログイン、多要素認証、役割ベースのアクセス制御などの追加機能を提供します。[Auth Libraries](#auth-libraries)セクションでリストを見ることができます。
+このページの例は、教育目的のための基本的なユーザー名とパスワード認証を説明します。独自の認証ソリューションを実装することもできますが、セキュリティとシンプルさを高めるためには認証ライブラリを使用することをお勧めします。これらは、認証、セッション管理、認可の組み込みソリューションを提供するだけでなく、ソーシャルログイン、多要素認証、ロールベースのアクセス制御などの追加機能も提供します。詳細は [Auth Libraries](#auth-libraries) セクションで見つけることができます。
-## Authentication {#authentication}
+## 認証 {#authentication}
-### 新規登録とログイン機能 {#sign-up-and-login-functionality}
+### サインアップとログイン機能 {#sign-up-and-login-functionality}
-Reactの[Server Actions](/docs/app/building-your-application/data-fetching/server-actions-and-mutations)および`useFormState`と共に[`
)
}
-
-function SubmitButton() {
- const { pending } = useFormStatus()
-
- return (
-