身份驗證和授權是 Web 應用程式安全性中的兩個基本概念。當我們建立 Web 應用程式時,確保只有正確的使用者才能存取我們網站的某些部分對於安全性至關重要。這就是身份驗證和授權發揮作用的地方。
在本文中,我們將討論身份驗證和授權,以及如何在 Nodejs 應用程式中實作它們。
那麼事不宜遲,讓我們開始吧!
授權是授予使用者執行特定工作/操作的權限的過程。它決定允許經過身份驗證的使用者在應用程式內執行哪些操作。經過驗證後,授權可確保使用者僅執行允許執行的操作,並遵循特定的規則和權限。
一些常見的身份驗證方式是:
基於角色的存取控制 (RBAC)
基於屬性的存取控制 (ABAC)
基於策略的存取控制(PBAC)
授權過程如下:
經過身份驗證的使用者向伺服器發出請求。
伺服器驗證使用者並取得其指派的角色和權限。
伺服器評估使用者是否有權執行所請求的操作。
如果使用者獲得授權,伺服器將允許使用者執行請求的操作。
否則,它會拒絕存取並返回適當的回應。
基於角色的存取控制是一種存取控制方法,它根據使用者在應用程式中分配的角色向使用者授予權限。簡而言之,它控制用戶在應用程式中可以執行的操作。
RBAC 不是將權限指派給單一用戶,而是將使用者分組為角色,然後將權限指派給這些角色。這使得管理存取控制變得更加容易,因為我們只需要更新角色的權限,而不是每個單獨使用者的權限。
RBAC 的關鍵元件是:
角色:定義應用程式內的一組職責、任務或功能
權限:代表使用者可以執行的特定操作。
角色分配:使用者被指派給一個或多個角色,每個角色都與一組權限相關聯。
存取控制策略:規定哪些角色可以存取特定資源以及他們可以採取哪些操作。
到目前為止,我們已經了解了身份驗證和授權。讓我們探索如何在 NodeJS 應用程式中實現它們。
在本節中,我們將建立一個簡單的 NodeJs 應用程式並整合身份驗證和授權功能。
要設定基本的 Node.js 專案並新增 JWT 身份驗證,您可以查看以下文章,其中我詳細解釋了每個步驟:
在本節中,我們將在 Nodejs 應用程式中實作授權。
我們將更新使用者架構並新增一個「角色」字段,我們將在其中定義使用者的角色/範圍。我們將在後面的部分中使用這些角色進行授權。
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);
接下來,我們將更新/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" });
}
});
現在,我們將建立一個中間件來驗證使用者是否是管理員。
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;
之後,我們將在主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}`);
});
在註冊路徑中,我們將建立一個具有管理員角色的新使用者。
為此,我們將使用以下正文向http://localhost:3000/auth/signup
發出 POST 請求:
{
"username": "Arindam Majumder",
"password": "071204",
"role": "admin"
}
新用戶已註冊。我們更新後的註冊報價正常運作。
同樣,在登入路由中,我們將取得新使用者的令牌。
為此,我們將使用類似的正文向http://localhost:3000/auth/login
發出 GET 請求:
{
"username": "Arindam Majumder",
"password": "071204",
"role": "admin"
}
我們將得到一個像這樣的令牌:
現在,我們將測試我們的管理路由。為此,我們將使用以下正文向http://localhost:3000/admin
發出 GET 請求:
{
"username": "Arindam Majumder",
"password": "071204",
"role": "admin"
}
這次我們還必須加入一個授權標頭並在其中加入令牌來驗證我們的用戶。
Authorization = USERS_JWT_TOKEN
我們將得到以下回應:
這意味著我們的端點正在按預期工作。
至此,我們已經在 NodeJs 應用程式中成功實現了授權。
總的來說,身份驗證和授權在現代 Web 應用程式中非常重要。
在本文中,我們介紹了身份驗證和授權的基礎知識以及如何將它們整合到 NodeJs 應用程式中。
希望您覺得這有幫助。不要忘記分享您對評論的回饋。
如需付費合作,請發送電子郵件至: [email protected]
在Twitter 、 LinkedIn 、 Youtube和GitHub上與我聯絡。
快樂編碼!
原文出處:https://dev.to/arindam_1729/how-to-implement-authorization-in-nodejs-31hk