我有一个使用express的小节点应用程序。为了使用户提交表单数据,他们必须登录。登录时,他们会获得一个json网络令牌,该令牌应传递给auth中间件以验证他们可以提交表单。
我在将JWT发送到auth中间件时遇到麻烦。
用户登录后被发送到页面提交表单的授权如下:
router.post('/auth', async (req, res, next) => {
const { error } = validate(req.body);
if (error) return res.status(400).send(error.details[0].message);
let user = await User.findOne({ email: req.body.email });
if (!user) return res.status(400).send('Invalid email or password.');
const validPassword = await bcrypt.compare(req.body.password, user.password);
if (!validPassword) return res.status(400).send('Invalid email or password.');
const token = user.generateAuthToken();
res.set({'x-auth-token': token }).render('../views/index/form', { 'x-auth-token': token })
;});
提交表单的路线如下:
router.post('/rates', auth, async (req, res) => {
const { error } = validate(req.body);
if (error) return res.status(400).send(error.details[0].message);
let rates = new Rates({
// deleted to save space
});
rates = await rates.save();
res.send(rates);
});
如您所见,要发布,它必须首先通过auth中间件,如下所示:
const config = require('config');
const jwt = require('jsonwebtoken');
function auth(req, res, next) {
const token = req.header('x-auth-token');
if (!token) return res.status(401).send('Access denied. No token provided.')
try {
const decoded = jwt.verify(token, config.get('jwtPrivateKey'));
req.user = decoded;
next();
}
catch (ex) {
res.status(400).send('Invalid token.');
}
}
module.exports = auth;
我收到“访问被拒绝。未提供令牌”。每一次。当我对Postman进行评分并在其中设置标头时,它可以正常工作。
我正在通过带有快速把手的页面发送此表单数据。 我不确定我是否以错误的方式使用res.set,或者在呈现把手表单视图时是否丢失了某些东西?
当我在前端登录,直接转到表单页面并在chrome inspector中查看标题时,可以看到x-auth-token。但是,一旦我尝试在前端提交用于费率的表单数据,身份验证令牌就会丢失,并且在身份验证中间件处会失败。
有些东西我只是看不见。
这是我发送表单数据的页面上的代码:
<script>
var formElement = document.querySelector("form");
var header = XMLHttpRequest.getResponseHeader("x-auth-token");
var xhr = new XMLHttpRequest();
xhr.open('POST', '/rates', true);
xhr.setRequestHeader("x-auth-token", header);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.onreadystatechange = function() {
if(this.readyState == XMLHttpRequest.DONE && this.status = 200) {
console.log("success");
} else {
console.log("error sending")
}
}
xhr.send(new FormData(formElement));
</script>