阿川私房教材:學程式,拿 offer!

63 個專案實戰,直接上手!
無需補習,按步驟打造你的面試作品。

立即解鎖你的轉職秘笈

介紹:

身份驗證和授權是 Web 應用程式安全性中的兩個基本概念。當我們建立 Web 應用程式時,確保只有正確的使用者才能存取我們網站的某些部分對於安全性至關重要。這就是身份驗證和授權發揮作用的地方。

在本文中,我們將討論身份驗證和授權,以及如何在 Nodejs 應用程式中實作它們。

那麼事不宜遲,讓我們開始吧!

了解授權

顯示 HTML 程式碼的電腦螢幕特寫,並顯示錯誤訊息「驗證失敗。請聯絡管理員」。

什麼是授權?

授權是授予使用者執行特定工作/操作的權限的過程。它決定允許經過身份驗證的使用者在應用程式內執行哪些操作。經過驗證後,授權可確保使用者僅執行允許執行的操作,並遵循特定的規則和權限。

一些常見的身份驗證方式是:

  • 基於角色的存取控制 (RBAC)

  • 基於屬性的存取控制 (ABAC)

  • 基於策略的存取控制(PBAC)

授權如何運作?

授權過程如下:

  • 經過身份驗證的使用者向伺服器發出請求。

  • 伺服器驗證使用者並取得其指派的角色和權限。

  • 伺服器評估使用者是否有權執行所請求的操作。

  • 如果使用者獲得授權,伺服器將允許使用者執行請求的操作。

  • 否則,它會拒絕存取並返回適當的回應。

什麼是基於角色的存取控制 (RBAC)?

說明基於角色的存取控制 (RBAC) 的圖表。客戶端將帶有使用者憑證的管理服務請求傳送到管理節點管理器。管理節點管理器定義權限層級的角色,與服務 1、服務 2 和服務 3 互動以執行身份驗證並確保用戶端有權存取。然後客戶端接收並處理回應。

基於角色的存取控制是一種存取控制方法,它根據使用者在應用程式中分配的角色向使用者授予權限。簡而言之,它控制用戶在應用程式中可以執行的操作。

RBAC 不是將權限指派給單一用戶,而是將使用者分組為角色,然後將權限指派給這些角色。這使得管理存取控制變得更加容易,因為我們只需要更新角色的權限,而不是每個單獨使用者的權限。

RBAC 的關鍵元件是:

  • 角色:定義應用程式內的一組職責、任務或功能

  • 權限:代表使用者可以執行的特定操作。

  • 角色分配:使用者被指派給一個或多個角色,每個角色都與一組權限相關聯。

  • 存取控制策略:規定哪些角色可以存取特定資源以及他們可以採取哪些操作。

在 NodeJS 中實作授權

到目前為止,我們已經了解了身份驗證和授權。讓我們探索如何在 NodeJS 應用程式中實現它們。

在本節中,我們將建立一個簡單的 NodeJs 應用程式並整合身份驗證和授權功能。

基本專案設定和身份驗證

要設定基本的 Node.js 專案並新增 JWT 身份驗證,您可以查看以下文章,其中我詳細解釋了每個步驟:

設定基本 Node.js 專案並新增 JWT Auth

實施授權

在本節中,我們將在 Nodejs 應用程式中實作授權。

1. 更新用戶架構:

我們將更新使用者架構並新增一個「角色」字段,我們將在其中定義使用者的角色/範圍。我們將在後面的部分中使用這些角色進行授權。

const mongoose = require("mongoose");

const userSchema = new mongoose.Schema({
  username: {
    type: String,
    required: true,
    unique: true,
  },
  password: {
    type: String,
    required: true,
  },
  role:{
    type: String,
    required: true,
    default: "user",
  }
});

module.exports = mongoose.model("User", userSchema);

2. 更新認證路由:

接下來,我們將更新/signup/login路由。我們將從註冊路由的請求正文中獲取新新增的角色。

// updated sign up
router.post("/signup", async (req, res) => {
  try {
    const { username, password, role } = req.body;
    const user = new User({ username, password,role });
    await user.save();
    res.status(201).json({ message: "New user registered successfully" });
  } catch (error) {
    res.status(500).json({ message: "Internal server error" });
  }
});

在登入路徑中,就像使用者名稱和密碼驗證一樣,我們也會驗證使用者的角色。

// Updated Login route
router.post("/login", async (req, res) => {
  const { username, password, role } = req.body;
  try {
    const user = await User.findOne({ username });

    if (!user) {
      return res.status(401).json({ message: "Invalid username or password" });
    }
    if (user.password !== password) {
      return res.status(401).json({ message: 'Invalid username or password' });
    }
    if (user.role !== role) {
      return res.status(401).json({ message: 'Invalid role' });
    }
    // Generate JWT token
    const token = jwt.sign(
      { id: user._id, username: user.username, role: user.role},
      process.env.JWT_SECRET
    );
    res.json({ token });
  } catch (error) {
    res.status(500).json({ message: "Internal server error" });
  }
});

3. 建立管理驗證中間件:

現在,我們將建立一個中間件來驗證使用者是否是管理員。

function verifyAdmin(req, res, next) {

    if (req.user.role !== "admin") {
      return res.status(401).json({ message: "Access denied. You need an Admin role to get access." });
    }
    next();
  }

module.exports = verifyAdmin;

4. 建立管理路由:

之後,我們將在主index.js中建立一個管理路由來驗證使用者是否具有管理員存取權限。

// index.js
const adminMiddleware = require("./middleware/admin");

app.get("/admin", userMiddleware, adminMiddleware, (req, res) => {
  const { username } = req.user;
  res.send(`This is an Admin Route. Welcome ${username}`);
});

5. 測試端點:

在註冊路徑中,我們將建立一個具有管理員角色的新使用者。

為此,我們將使用以下正文向http://localhost:3000/auth/signup發出 POST 請求:

{
    "username": "Arindam Majumder",
    "password": "071204",
    "role": "admin"
}

Postman 介面的螢幕截圖,顯示了「http://localhost:3000/auth/signup」的 POST 要求,其中包含包含使用者名稱、密碼和角色的 JSON 正文。回應正文顯示一則訊息:“新用戶註冊成功”,狀態為 201 Created。

新用戶已註冊。我們更新後的註冊報價正常運作。

同樣,在登入路由中,我們將取得新使用者的令牌。

為此,我們將使用類似的正文向http://localhost:3000/auth/login發出 GET 請求:

{
    "username": "Arindam Majumder",
    "password": "071204",
    "role": "admin"
}

我們將得到一個像這樣的令牌:

Postman 介面的螢幕截圖顯示了對「http://localhost:3000/auth/login」的 POST 要求。請求內文包含 JSON 資料,其中包含「使用者名稱」、「密碼」和「角色」欄位。回應正文顯示帶有「令牌」欄位的 JSON 物件。請求的狀態為 200 OK。

現在,我們將測試我們的管理路由。為此,我們將使用以下正文向http://localhost:3000/admin發出 GET 請求:

{
    "username": "Arindam Majumder",
    "password": "071204",
    "role": "admin"
}

這次我們還必須加入一個授權標頭並在其中加入令牌來驗證我們的用戶。

Authorization = USERS_JWT_TOKEN

我們將得到以下回應:

Postman 介面的螢幕截圖,顯示了「http://localhost:3000/admin」的 GET 要求,其中包含 JSON 正文參數,包括「使用者名稱」、「密碼」和「角色」。回應部分顯示一條訊息:“這是一條管理路線。歡迎 Arindam Majumder。”狀態為 200 OK。

這意味著我們的端點正在按預期工作。

至此,我們已經在 NodeJs 應用程式中成功實現了授權。

結論

總的來說,身份驗證和授權在現代 Web 應用程式中非常重要。

在本文中,我們介紹了身份驗證和授權的基礎知識以及如何將它們整合到 NodeJs 應用程式中。

希望您覺得這有幫助。不要忘記分享您對評論的回饋。

如需付費合作,請發送電子郵件至: [email protected]

TwitterLinkedInYoutubeGitHub上與我聯絡。

快樂編碼!

謝謝 :)


原文出處:https://dev.to/arindam_1729/how-to-implement-authorization-in-nodejs-31hk


共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。

阿川私房教材:學程式,拿 offer!

63 個專案實戰,直接上手!
無需補習,按步驟打造你的面試作品。

立即解鎖你的轉職秘笈