首頁 > web前端 > js教程 > 主體

保護 Node.js API:身份驗證簡單指南

DDD
發布: 2024-09-19 00:29:32
原創
872 人瀏覽過

Securing a Node.js API: A Simple Guide to Authentication

我建立了一個 Node.js API 並想要保護它,所以我檢查了必須選擇的幾個選項。因此,我將引導您了解三種常見的驗證方法:基本驗證JWT(JSON Web 令牌)API 金鑰

1. 基本認證

它是什麼?

基本驗證非常簡單。客戶端在 Authorization 標頭中隨每個請求發送使用者名稱和密碼。雖然它很容易實現,但它並不是最安全的,除非您使用 HTTPS,因為憑證僅採用 Base64 編碼(未加密)。

如何實施

要使用 Express 將基本驗證新增至您的 API,您需要:

  1. 安裝 basic-auth 套件:
   npm install basic-auth
登入後複製
  1. 新增身份驗證中間件:
   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 上的基本驗證以確保憑證受到保護。


2.JWT(JSON網路令牌)

它是什麼?

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 很棒,因為令牌有過期時間,並且不必在每個請求中發送憑證。


3.API金鑰認證

它是什麼?

API 金鑰驗證很簡單:您為每個用戶端提供一個唯一的金鑰,並將其包含在請求中。它很容易實現,但不如 JWT 安全或靈活,因為相同的金鑰會一遍又一遍地重複使用。最終是一個強大的解決方案,可以輕鬆地用於限制 api 調用的數量,並且許多網站都在使用它。作為額外的安全措施,可以將請求限製到特定的 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/
登入後複製

認證方法總結

  • 基本驗證

    • 優點:易於設定。
    • 缺點:憑證會隨每個請求一起傳送,因此應透過 HTTPS 使用。
    • 用例:使用者數量較少的簡單 API。
  • JWT 驗證

    • 優點:安全、無狀態且可擴充性良好。
    • 缺點:比基本驗證更複雜。
    • 用例:需要強大安全性的可擴充 API。
  • API 金鑰驗證

    • 優點:簡單且使用廣泛。
    • 缺點:與 JWT 相比,API 金鑰安全性較低,且較難管理。
    • 使用案例:您想要在沒有使用者管理的情況下對客戶端進行身份驗證的簡單 API。

結論

如果您正在尋找快速簡單的方法,基本驗證 可以使用,但請記住使用 HTTPS。如果您想要更強大、可擴充的安全性,請選擇 JWT。對於輕量級或內部 API,API 金鑰 驗證可能就足夠了。

您打算使用哪種身份驗證方法或您有其他解決方案嗎?請在評論中告訴我!

以上是保護 Node.js API:身份驗證簡單指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!