您的身份验证 API 应返回嵌入有保证信息(角色)的 JWT。此外,应该使用您的视图 API 已知的秘密来创建令牌。
例如,使用 npm 模块jsonwebtoken https://www.npmjs.com/package/jsonwebtoken,像这样签名:
token = jwt.sign( {
exp: Math.floor( Date.now() / 1000 ) + ( 60 * 60 ), // 1 hour
i: user._id,
role: user.role
}, "my-secret" );
然后,在您的视图 API 上,使用护照-jwt https://www.npmjs.com/package/passport-jwt,它既验证令牌又为您提供与您签名的原始对象匹配的有效负载。使用有效负载作为用户对象:
passport.use( new JwtStrategy( {
secretOrKey: "my-secret"
}, ( payload, callback ) => callback( null, payload ) ) );
const authenticate = () =>
passport.authenticate( "jwt", { session: false, failWithError: true } )
在此阶段,您的用户至少已通过身份验证。如果您想将视图限制为某些角色,您可以添加第二个中间件:
const assertRole = ( ...roles ) => ( req, res, next ) =>
req.user && roles.includes( req.user.role ) ? next() : res.sendStatus( 403 ) );
todoRoutes.get("/admin/view1", authenticate, assertRole( "user", "editor", "admin" ), TodoController.getTodos );
如果您的视图需要有关用户的更多信息,则身份验证 API 将需要在 JWT(因此有保证)或外部(不保证,但会产生较小的令牌)中提供该信息。