passport.use jwt传递角色参数

passport.use jwt pass role parameter

我如何将附加参数(将有权访问此 api 的角色)传递给护照 jwt 身份验证功能?

我想在里面添加role check,但是我无法通过role。 这是它的样子:

passport.use(
    'jwt',
    new JWTstrategy(opts, (jwt_payload, done) => {
        try {...

这是它被调用的地方:

app.post('/addFeature', passport.authenticate('jwt', {session: false}), (req, res, next) =>{...

JWT auth 函数无需传递更多参数

这是我在这个场景中使用的。

首先,我假设您的 JWT 在其负载中包含用户角色信息。 Passport 仅用于验证 JWT。它检查 JWT 是否有效。如果有效,它会解析 JWT 负载供您使用。

This code is from official documentation of Passport JWT

passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
    User.findOne({id: jwt_payload.sub}, function(err, user) {
        if (err) {
            return done(err, false);
        }
        if (user) {
            return done(null, user);
        } else {
            return done(null, false);
        }
    });
}));

如您所见,它通过使用已解析的 JWT 中的 JWT SUB 找到用户。

jwt_payload.sub

如果你把你的角色放在你的 JWT 中,你可以这样做:

jwt_payload.roles

然后请注意,如果用户发现它使用第二个参数 "user" 调用 done。它只是给护照一些东西放在请求对象中。所以你可以从你的请求对象中使用它,比如:

req.user

现在您可以传递用户对象,而不是传递用户实例。

const user = {
    instance: user,
    roles: jwt_payload.roles // or what is ok for you
}

return done(null, user);

现在记住,ExpressJS 中间件逻辑。你可以创建一个角色检查器中间件并在jwt认证方法之后使用它。

const roleCheckMiddleware = (req, res, next, roles) => {
    // if req.roles does not contain given roles, return response with status code forbidden.
};

并通过必要的呼叫定义您的路线。

app.post(
    '/addFeature',
    passport.authenticate('jwt', {session: false}),
    (req, res, next) => { roleCheckMiddleware(req, res, next, ['admin', 'manager'] }
);