将JWT标头传递到Express中的授权中间件

时间:2018-09-19 16:12:57

标签: node.js express handlebars.js jwt

我有一个使用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>

0 个答案:

没有答案