コンテンツの概要
この記事は、Express.js を使用した基本的な CRUD API 作成について説明した以前のチュートリアルを拡張し、検証、認証、承認といった重要なセキュリティ面に焦点を当てています。 前の例に基づいて説明するので、その内容をよく理解しておくことをお勧めします。 完全なプロジェクトは GitHub で入手できます (リンクは下にあります)。
主要な概念
検証: ユーザーが提供したデータが事前定義されたルールと標準に準拠していることを確認します。 これはセキュリティにとって最も重要であり、SQL インジェクションなどの脆弱性を防ぎます。 いくつかのリソースでは、堅牢な検証の重要性を強調しています (リンクは以下に提供されます)。
認証: ユーザーの身元を確認します。これには通常、保存されている記録と照合して資格情報 (ユーザー名/電子メール、パスワードなど) をチェックすることが含まれます。
認可: ユーザーが実行できるアクションを決定します。 これにより、ユーザーの役割と権限に基づいてリソースへのアクセスが制御されます。
検証の実装
name
、amount
、および date
フィールドの検証関数を作成します。
name
: 空でない文字列、10 ~ 255 文字。amount
: 数値または数値文字列、正の空でない。date
: 文字列、オプション (省略した場合はデフォルトで現在の日付)、YYYY-MM-DD 形式。これらの関数 (validations.js
にあります) は、型チェックと基本的な形式の検証を利用します。 より包括的な検証 (日付範囲チェックなど) を追加できます。
<code class="language-javascript">// validations.js (excerpt) const isString = (arg) => typeof arg === "string"; const isNumber = (arg) => !isNaN(Number(arg)); function isValidName(name) { /* ... */ } function isValidAmount(amount) { /* ... */ } function isValidDate(date) { /* ... */ } module.exports = { isValidName, isValidAmount, isValidDate };</code>
認証と認可の追加
デモンストレーションのために、ユーザーと経費のためにメモリ内のデータ ストレージ (オブジェクトの配列) を使用します。 これは本番環境には適していません。
data.js
ファイルには、ユーザーと経費のデータが保存されます:
<code class="language-javascript">// data.js (excerpt) let users = [ { id: "...", email: "...", password: "..." }, //Example User // ...more users ]; let expenditures = [ { id: "...", userId: "...", name: "...", amount: ..., date: "..." }, //Example Expense // ...more expenses ]; module.exports = { expenditures, users };</code>
サインアップエンドポイント (/users/signup
)
このエンドポイントは新しいユーザーを作成します。 電子メールとパスワードを検証し、電子メールの重複をチェックし、UUID を生成し、(このデモのみ) 生のパスワードを保存します。 Base64 でエンコードされた認証トークン (電子メール:UUID) が返されます。 わかりやすくするためにパスワードのハッシュ化は省略されていますが、運用環境では非常に重要です。
ログインエンドポイント (/users/login
)
このエンドポイントは既存のユーザーを認証します。 資格情報を検証し、成功した場合は、base64 でエンコードされた認証トークンを返します。
保護されたエンドポイント
エンドポイント (例: /expenditures
) を保護するには、リクエスト ヘッダー (Authorization
ヘッダー) に認証トークンが必要です。トークンがデコードされ、ユーザーが検証され、ユーザー自身のデータのみが返されます。
<code class="language-javascript">// validations.js (excerpt) const isString = (arg) => typeof arg === "string"; const isNumber = (arg) => !isNaN(Number(arg)); function isValidName(name) { /* ... */ } function isValidAmount(amount) { /* ... */ } function isValidDate(date) { /* ... */ } module.exports = { isValidName, isValidAmount, isValidDate };</code>
結論
この記事では、Node.js/Express.js API における検証、認証、認可の基本的な概要を説明しました。 ここで説明するセキュリティ対策は教育目的で簡略化されているため、運用システムでは使用すべきではありません。 本番環境に対応したアプリケーションには、堅牢なパスワード ハッシュ、安全なトークン管理 (JWT を推奨)、データベース統合が必要です。
リソース
(括弧で囲まれたプレースホルダーを実際のリンクに置き換えることを忘れないでください。)
以上が検証、認証、認可の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。