gpt4 book ai didi

node.js - 如何使用基于 token 的身份验证在 Node.js 中实现基于角色的授权?

转载 作者:太空宇宙 更新时间:2023-11-03 23:17:43 24 4
gpt4 key购买 nike

如何使用 REST API 方法(即基于 token 的身份验证)在 Node js 中为具有三个角色(学生、家长和管理员)的教育公司实现多重身份验证。

最佳答案

<强>0。概念

JWT token ( https://jwt.io/ ) 包含一个有效负载,在此有效负载中,您可以指定自定义角色对象。在角色对象中,您可以设置 bool 值来确定角色是学生、家长还是管理员。

负载示例

{
...
"role": {
student: true,
parent: false,
admin: false,
}
}

当您为特定用户生成 token 时,请将有效负载详细信息附加到 token 。 (当然,您可以根据您希望用户是学生、家长还是管理员来调整有效负载详细信息)。

每当用户将来使用其 token 发出请求时,您都可以进行回调来检查其 token 并查看 payload.role 对象以了解用户具有什么角色,然后执行决定他们是否有权执行特定操作。

<强>1。生成 token

参见https://www.npmjs.com/package/jsonwebtoken有关生成 token 的更多信息。

   const payload = {
userid: 123,
role: {
student: false,
parent: false,
admin: true,
},
};

const signOptions = {
issuer: this.config.jwt.issuer,
subject: payload.userid,
audience: this.config.jwt.audience,
expiresIn: "730d",
algorithm: "RS256",
};

const token = jwt.sign(payload, this.config.jwt.privateKey.replace(/\\n/g, "\n"), signOptions);

<强>2。检查角色的中间件

如果您使用带有 JWT 身份验证的 Passport ,您应该已经拥有类似的内容。

const authGuard = PassportMiddleware.authenticate("jwt", { session: false });

router.get("/admin", authGuard, controller.index);

我们需要一个新的中间件来处理角色检查。我们将这个中间件称为adminGuard。使用 authGuard 中间件进行身份验证后,req 对象将包含用户(即 jwt 有效负载)。现在我们有了用户信息,我们可以检查他们的角色。

const adminGuard = (req, res, next) =>  {
if(req.user && !req.user.role.admin) {
next(new Error('You are not an admin'));
} else {
next();
}
}

router.get("/admin", authGuard, adminGuard, controller.index);

您可以为每个角色创建一个新的中间件防护。

关于node.js - 如何使用基于 token 的身份验证在 Node.js 中实现基于角色的授权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53364187/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com