node.js - 向 Node Web 服务器的每个请求发送有效的 JWT 令牌时出现禁止 403 http 错误
问题描述
该应用程序有一个 inlog 组件,登录时我得到一个 JWT 令牌。此令牌很好地保存在 LocalStorage 中。我可以在浏览器中看到:
我使用 angular-jwt ("@auth0/angular-jwt": "^3.0.0") 并在 mij app.module.ts 中配置:
JwtModule.forRoot({
config: {
tokenGetter: () => {
return localStorage.getItem("schoolsysteem");
},
headerName: 'Authorization',
authScheme: 'Bearer ',
whitelistedDomains: ["localhost:3000/*"],
blacklistedRoutes: [""]
}
})
headerName 和 authScheme 与默认值相同。实际上,此配置会为每个请求添加带有令牌的 Authorization 标头。
客户端请求的示例是:
const subjectJsonArr = '{"name":"'+vakParam.name+'"}';//,"tabs":"'+vakParam.tabs+'"}';
this.http.post<any>(`http://localhost:3000/addSubject`, JSON.parse(subjectJsonArr)).subscribe((val) => { //more code }
/routes/addSubject.js 中 NodeJs 上的服务器端代码
module.exports = app => {
app.post('/addSubject', function(req, res, next) {
passport.authenticate('jwt', { session: false }, (err, user, info) => {
if (err) {
console.error(err);
}
console.log(req.valueOf());
if (info !== undefined) {
console.error(info.message);
res.status(403).send(info.message);
} else {
req.logIn(user, error => {
const data = {
name: req.body.name
};
console.log('data: '+data);
User.findOne({
where: {
name: data.name,
},
}).then(user => {
console.log(user);
user
.update({
name: data.name
})
.then(() => {
console.log('subject created in db');
res.status(200).send({ message: 'subject created' });
});
});
});
}
})(req, res, next);
});
};
这是浏览器控制台(Chrome v75)中的错误信息:
这里是身份验证的代码。部分节点:
passport.use(
'addSubject',
new LocalStrategy(
{
usernameField: 'username',
passwordField: 'password',
passReqToCallback: true,
session: false,
},
(req, username, password, done) => {
console.log('name: '+req.body.name);
try {
User.findOne({
where: {
[Op.or]: [
{
username,
},
{ email: req.body.email },
],
},
}).then(user => {
if (user != null) {
console.log('username or email already taken');
return done(null, false, {
message: 'username or email already taken',
});
}
bcrypt.hash(password, BCRYPT_SALT_ROUNDS).then(hashedPassword => {
User.create({
username,
password: hashedPassword,
email: req.body.email,
role: req.body.role,
firstName: req.body.firstName,
lastName: req.body.lastName
}).then(user => {
console.log('user created');
return done(null, user);
});
});
});
} catch (err) {
return done(err);
}
},
),
);
const opts = {
jwtFromRequest: ExtractJWT.fromAuthHeaderWithScheme('schoolsysteem'),
secretOrKey: jwtSecret.secret,
};
passport.use(
'jwt',
new JWTstrategy(opts, (jwt_payload, done) => {
try {
User.findOne({
where: {
id: jwt_payload.id,
},
}).then(user => {
if (user) {
console.log('user found in db in passport');
done(null, user);
} else {
console.log('user not found in db');
done(null, false);
}
});
} catch (err) {
done(err);
}
}),
);
有人可以看到 403 错误的原因是什么吗?谢谢!
解决方案
推荐阅读
- java - 不支持使用 Amazon Keyspaces 的分区程序(适用于 Apache Cassandra)
- python - Python,如何将 2D 数组堆叠成 3D 数组
- javascript - 如何从 webpack 运行 gulp 任务
- java - 从数组中的六个随机生成的值 (1-6) 中,运行一些代码来查看有多少匹配值以及哪些匹配
- javascript - 水平和垂直获得完全相同的图像尺寸(特殊情况)
- python - 如何通过python打开文件资源管理器
- json - 诺克斯令牌是安全的吗?
- spring-security - 如果在spring webffux中过期或未过期,如何通过检查前一个的生命周期来获取新的访问令牌?
- python - 我已经安装了 OpenCV C++。我可以在不重新安装库的情况下在 Python 中使用它的功能吗?
- bash - -Bash Shell 脚本“没有这样的文件或目录”