>
)}
@@ -286,10 +282,10 @@ function PushNotificationManager() {
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 (
@@ -336,12 +332,12 @@ function InstallPrompt() {
{isIOS && (
このアプリをiOSデバイスにインストールするには、共有ボタン
-
+
{' '}
⎋{' '}
をタップし、「ホーム画面に追加」
-
+
{' '}
➕{' '}
@@ -376,7 +372,7 @@ function InstallPrompt() {
}, []);
if (isStandalone) {
- return null; // すでにインストールされている場合はインストールボタンを表示しない
+ return null; // 既にインストールされている場合、インストールボタンを表示しない
}
return (
@@ -386,12 +382,12 @@ function InstallPrompt() {
{isIOS && (
このアプリをiOSデバイスにインストールするには、共有ボタン
-
+
{' '}
⎋{' '}
をタップし、「ホーム画面に追加」
-
+
{' '}
➕{' '}
@@ -412,11 +408,11 @@ export default function Page() {
}
```
-次に、これが呼び出すServer Actionsを作成します。
+次に、このファイルで呼び出されるServer Actionsを作成します。
### 3. Server Actionsの実装 {#3-implementing-server-actions}
-`app/actions.ts`にアクションを含める新しいファイルを作成します。このファイルは、購読の作成、削除、および通知の送信を処理します。
+`app/actions.ts`にアクションを含む新しいファイルを作成します。このファイルは、購読の作成、削除、および通知の送信を処理します。
@@ -434,41 +430,38 @@ 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('No subscription available')
}
try {
await webpush.sendNotification(
subscription,
JSON.stringify({
- title: 'テスト通知',
+ title: 'Test Notification',
body: message,
icon: '/icon.png',
})
)
return { success: true }
} catch (error) {
- console.error('プッシュ通知の送信エラー:', error)
- return { success: false, error: '通知の送信に失敗しました' }
+ console.error('Error sending push notification:', error)
+ return { success: false, error: 'Failed to send notification' }
}
}
```
@@ -489,41 +482,38 @@ 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('No subscription available');
}
try {
await webpush.sendNotification(
subscription,
JSON.stringify({
- title: 'テスト通知',
+ title: 'Test Notification',
body: message,
icon: '/icon.png',
})
);
return { success: true };
} catch (error) {
- console.error('プッシュ通知の送信エラー:', error);
- return { success: false, error: '通知の送信に失敗しました' };
+ console.error('Error sending push notification:', error);
+ return { success: false, error: 'Failed to send notification' };
}
}
```
@@ -533,31 +523,30 @@ export async function sendNotification(message) {
通知の送信は、ステップ5で作成したサービスワーカーによって処理されます。
-本番環境では、サーバー再起動時の永続性や複数のユーザーの購読を管理するために、データベースに購読情報を保存することをお勧めします。
+本番環境では、サーバーの再起動時に購読を保持し、複数のユーザーの購読を管理するために購読をデータベースに保存することをお勧めします。
### 4. VAPIDキーの生成 {#4-generating-vapid-keys}
-WebプッシュAPIを使用するには、[VAPID](https://vapidkeys.com/)キーを生成する必要があります。
+Web Push 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}
@@ -582,45 +571,45 @@ self.addEventListener('push', function (event) {
})
self.addEventListener('notificationclick', function (event) {
- console.log('通知クリックを受け取りました。')
+ console.log('Notification click received.')
event.notification.close()
event.waitUntil(clients.openWindow(''))
})
```
-このサービスワーカーは、カスタム画像と通知をサポートしています。受信プッシュイベントと通知のクリックを処理します。
+このサービスワーカーはカスタム画像と通知をサポートします。プッシュイベントの受信と通知のクリックを処理します。
-- `icon`や`badge`プロパティを使用して通知用のカスタムアイコンを設定できます。
-- `vibrate`パターンを調整して、サポートされているデバイスでカスタムバイブレーションアラートを作成できます。
+- 通知のカスタムアイコンを`icon`プロパティと`badge`プロパティを使用して設定できます。
+- `vibrate`パターンを調整して、サポートされているデバイスでのカスタムバイブレーションアラートを作成できます。
- `data`プロパティを使用して通知に追加のデータを添付できます。
-さまざまなデバイスとブラウザーで期待どおりに動作することを確認するために、サービスワーカーを徹底的にテストしましょう。また、`notificationclick`イベントリスナー内の`'https://your-website.com'`リンクをアプリケーションに適したURLに更新してください。
+サービスワーカーの動作がデバイスやブラウザによって異ならないかを確認するために、十分にテストを行うことが重要です。また、`notificationclick`イベントリスナー内の`'https://your-website.com'`リンクをアプリケーションの適切なURLに更新してください。
-### 6. ホーム画面への追加 {#6-adding-to-home-screen}
+### 6. ホーム画面に追加 {#6-adding-to-home-screen}
-ステップ2で定義した`InstallPrompt`コンポーネントは、iOSデバイスにホーム画面に追加するためのメッセージを表示します。
+ステップ2で定義した`InstallPrompt`コンポーネントは、iOSデバイスにホーム画面にインストールするよう指示するメッセージを表示します。
-モバイルのホーム画面にアプリケーションをインストールできるようにするためには、以下が必要です:
+あなたのアプリケーションをモバイルのホーム画面にインストールできるようにするためには、次の要件を満たす必要があります:
-1. 有効なweb app manifest(ステップ1で作成したもの)
-2. HTTPSで提供されるウェブサイト
+1. 有効なweb app manifest(ステップ1で作成)
+2. HTTPSで配信されるウェブサイト
-これらの条件が満たされた場合、最新のブラウザは自動的にユーザーにインストールの プロンプトを表示します。[`beforeinstallprompt`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeinstallprompt_event)を使用してカスタムインストールボタンを提供することもできますが、これはSafari iOSでは機能しないため、クロスブラウザおよびプラットフォームには推奨しません。
+現代のブラウザはこれらの条件が満たされると、自動的にインストールプロンプトをユーザーに表示します。`beforeinstallprompt`イベントを使用してカスタムインストールボタンを提供することもできますが、これはクロスブラウザやプラットフォームではなく(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実行](https://nextjs.org/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`:リファラー情報を含むリクエストの制御、セキュリティと機能性のバランス。
+ 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. `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はさまざまなウェブAPIを活用して高度な機能を提供することができます。背景同期、定期的な背景同期、またはファイルシステムアクセスAPIなどの機能を探り、アプリケーションを強化することを検討してください。PWAの機能や最新情報については、[What PWA Can Do Today](https://whatpwacando.today/)のようなリソースを参照してください。
+2. **静的エクスポート**:サーバーを稼働させず代わりにファイルの静的エクスポートを使用する場合、Next.jsの設定を更新してこの変更を有効にできます。詳しくは[Next.js Static Export documentation](/docs/app/building-your-application/deploying/static-exports)を参照してください。ただし、Server Actionsから外部APIの呼び出しに移行する必要があります。また、定義されたヘッダーをプロキシに移動する必要があります。
+3. **オフラインサポート**:オフライン機能を提供するための方法の1つに、Next.jsと[Serwist](https://github.com/serwist/serwist)があります。Next.jsとの統合方法の例は、[documentation](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..ac85feb 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,17 +1,17 @@
---
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) セクションでリストを確認できます。
-## 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 (
-