Node.js API を構築し、それをセキュリティで保護したいので、選択する必要があるいくつかのオプションを確認しました。そこで、基本認証、JWT (JSON Web Token)、API キーという 3 つの一般的な認証方法について説明します。
Basic 認証は非常に簡単です。クライアントは、各リクエストの Authorization ヘッダーでユーザー名とパスワードを送信します。実装は簡単ですが、資格情報は Base64 でのみエンコードされる (暗号化されない) ため、HTTPS を使用しない限り、最も安全であるとは言えません。
Express を使用して API に Basic 認証を追加するには、次のものが必要です:
npm install basic-auth
const express = require('express'); const basicAuth = require('basic-auth'); const app = express(); function auth(req, res, next) { const user = basicAuth(req); const validUser = user && user.name === 'your-username' && user.pass === 'your-password'; if (!validUser) { res.set('WWW-Authenticate', 'Basic realm="example"'); return res.status(401).send('Authentication required.'); } next(); } app.use(auth); app.get('/', (req, res) => { res.send('Hello, authenticated user!'); }); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); });
curl を使用して基本認証をテストします:
curl -u your-username:your-password http://localhost:3000/
ヒント: 認証情報が確実に保護されるように、常に HTTPS 経由の基本認証を使用してください。
JWT は、ユーザーを認証するためのより安全でスケーラブルな方法です。リクエストごとに認証情報を送信する代わりに、サーバーはログイン時にトークンを生成します。クライアントは、後続のリクエストの Authorization ヘッダーにこのトークンを含めます。
まず、必要なパッケージをインストールします。
npm install jsonwebtoken express-jwt
JWT 認証を設定する方法の例を次に示します:
const express = require('express'); const jwt = require('jsonwebtoken'); const expressJwt = require('express-jwt'); const app = express(); const secret = 'your-secret-key'; // Middleware to protect routes const jwtMiddleware = expressJwt({ secret, algorithms: ['HS256'] }); app.use(express.json()); // Parse JSON bodies // Login route to generate JWT token app.post('/login', (req, res) => { const { username, password } = req.body; if (username === 'user' && password === 'password') { const token = jwt.sign({ username }, secret, { expiresIn: '1h' }); return res.json({ token }); } return res.status(401).json({ message: 'Invalid credentials' }); }); // Protected route app.get('/protected', jwtMiddleware, (req, res) => { res.send('This is a protected route. You are authenticated!'); }); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); });
まず、ログインしてトークンを取得します:
curl -X POST http://localhost:3000/login -d '{"username":"user","password":"password"}' -H "Content-Type: application/json"
次に、トークンを使用して保護されたルートにアクセスします。
curl -H "Authorization: Bearer <your-token>" http://localhost:3000/protected
JWT は、トークンに有効期限があり、リクエストごとに資格情報を送信する必要がないため、優れています。
API キー認証は簡単です。各クライアントに一意のキーを与え、クライアントはそれをリクエストに含めます。実装は簡単ですが、同じキーが何度も再利用されるため、JWT ほど安全性や柔軟性はありません。最終的には、API 呼び出しの数を制限するために簡単に使用できる堅牢なソリューションが得られ、多くの Web サイトで使用されています。追加のセキュリティ対策として、リクエストを特定の IP に制限できます。
これには特別なパッケージは必要ありませんが、dotenv を使用して API キーを管理することをお勧めします。まず、dotenv をインストールします:
npm install dotenv
次に、API キー認証を使用して API を作成します。
require('dotenv').config(); const express = require('express'); const app = express(); const API_KEY = process.env.API_KEY || 'your-api-key'; function checkApiKey(req, res, next) { const apiKey = req.query.api_key || req.headers['x-api-key']; if (apiKey === API_KEY) { next(); } else { res.status(403).send('Forbidden: Invalid API Key'); } } app.use(checkApiKey); app.get('/', (req, res) => { res.send('Hello, authenticated user with a valid API key!'); }); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); });
次の方法で API キー認証をテストできます:
curl http://localhost:3000/?api_key=your-api-key
またはカスタムヘッダーを使用します:
curl -H "x-api-key: your-api-key" http://localhost:3000/
基本認証:
JWT 認証:
API キー認証:
すばやく簡単な認証を探している場合は、基本認証 を使用できますが、HTTPS を使用することを忘れないでください。より堅牢でスケーラブルなセキュリティが必要な場合は、JWT を選択してください。軽量 API または内部 API の場合は、API キー 認証で十分な場合があります。
どの認証方法を使用する予定ですか、それとも他のソリューションがありますか?コメント欄でお知らせください!
以上がNode.js API のセキュリティ保護: 認証の簡単なガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。