Мне нужно выполнить авторизацию на основе ролей.
Я генерирую токен JWT с полезной нагрузкой, которая содержит данные о конкретном клиенте.Например, если им разрешено использовать функцию document
& face
.
Я создал программу passport.middleware, которая проверяет токен jwt, штраф.
Я применяю это промежуточное ПО jwt к моим маршрутам, хорошо.
ОДНАКО,
- для маршрута
/document
. Я хочу добавить здесь охрану, чтобы проверить, имеет ли полезная нагрузка jwt idcheck.document == true
. - Аналогично, пользователь может вызвать конечную точку
/face
, только если idcheck.face == true
В данный момент я проверяю только, является ли JWT действительным.Каждая конечная точка должна быть защищена, чтобы проверить, является ли токен действительным И имеют ли они роль для доступа к конечной точке.Как я могу расширить свой код для реализации этого, как лучше здесь.
1./ auth / token (Генерация токена JWT)
const payload = {
idcheck: {
productId,
document: true,
face: false,
},
};
const signOptions = {
issuer: this.config.jwt.issuer,
subject: productId,
audience: this.config.jwt.audience,
expiresIn: "730d",
algorithm: "RS256",
};
const token = jwt.sign(payload, this.config.jwt.privateKey.replace(/\\n/g, "\n"), signOptions);
2.passport.middleware.js
private jwtStrategy(): void {
const verifyOptions: StrategyOptions = {
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: this.config.jwt.publicKey.replace(/\\n/g, "\n"),
issuer: this.config.jwt.issuer,
audience: this.config.jwt.audience,
algorithms: ["RS256"],
};
this.passport.use(new Strategy(verifyOptions, (jwtPayload, done) => {
if (jwtPayload.idcheck === undefined) {
console.log("no idcheck present");
return done(null, false);
}
console.log("idcheck present", jwtPayload);
return done(null, jwtPayload );
}));
}
3.rout.js
this.jwtGuard = PassportMiddleware.authenticate("jwt", { session: false });
this.router.post("/document", this.jwtGuard, this.controller.document);
this.router.post("/face", this.jwtGuard, this.controller.face);