0

我对 Express 和 NodeJS 还很陌生。auth-token在尝试先验证所述用户的存在时,我无法访问我的自定义创建的标头,然后才允许他们在系统中执行任何CRUD功能。它只是返回'undefined'而不是我放入其中的令牌。

所以下面是我在我的家庭GET路由器中创建我的自定义标头的地方。auth-token

// Home GET Router
router.get('/', verifyUser, async (req, res) => {

    // get user data by id
    const dbData = await All.findById({ _id: req.user._id })

    // store token passed as query 'tkn' in 'token' var
    const token = req.query.tkn

    // create custom header & render 'index.ejs' or homepage
    res
       .header('auth-token', token)
       .render('index', { data: dbData.data })
}

我成功地创建了自定义标头auth-token,没有问题,如下所示在我的索引或主页中:

在此处输入图像描述

现在,我正在尝试使用Home POST Router保存用户在主页中插入的新数据,如下所示。但它会首先检查用户是否有令牌使用功能:verifyUser1st

// Home POST Router
router.post('/', verifyUser1st, async (req, res) => {

    // save new data code here...
}

这是我的verifyUser1st功能:

function verifyUser1st(req, res, next) {

    // get token from header
    const token = req.header('auth-token') // this will return undefined

    // if have, then allow/continue next(). If don't have, then return error message
    if(!token) return res.status(401).json({ message: 'Accessed Denied!' }) // I got this error since token = undefined

    try {

        // verify the exist token
        const varified = jwt.verify(token, process.env.TOKEN_4LOGINUSER)
        req.user = varified
        next()
    } catch(err) {

        res.status(400).json({ message: 'Invalid token!' })
    }
}

但不幸的是,它返回Accessed Denied因为令牌是undefined

是否应该auth-token请求标头部分(在上面的蓝色圆圈图像中)而不是响应标头部分(在上面的红色圆圈图像中)才能使其工作?

如果,那我该怎么做?如果不是,那么您能否帮助我了解我应该首先学习哪些内容或主题才能使这项工作发挥作用,因为我对这个 HTTP、Express 和 NodeJS 环境有点陌生?

4

1 回答 1

0

简要回答您的问题 - 如果您想在标头中传递身份验证令牌,那么它应该在请求标头中传递。

但是,如果您希望某些中间件检查您以后可以在处理链中使用的令牌值,那么只需将其设置为 req 对象上的自定义属性并从那里访问它。没有理由尝试将某些内容塞入标题中,然后再将其解析出来。

const auth = (req, res, next) => {
let { token } = req.body;
try {
    console.log(token)
    if (!token)
        return res.status(401).json({ msg: 'no authentication token, authorisation denied' })

    const verified = jwt.verify(token, process.env.JWT_KEY);
    if (!verified)
        return res.status(401).json({ msg: 'no authentication token, authorisation denied' })

    req.user = verified.id;
    next();
}
catch (err) {
    res.status(500).json({ error: err.message });
}
}

因此,我们可以从状态中的某个地方获取它,或者在您的情况下从本地存储中获取它,而不是在标头中发送令牌。

在前端,我们会做类似的事情 const token = localStorage.getItem("auth-token");

然后我们会将这个令牌传递给 API 请求。

于 2020-07-22T13:41:09.577 回答