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'] }
);
我如何将附加参数(将有权访问此 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'] }
);