cookie 中的访问令牌,但验证无法在 react.js(axios) 中检测到它,在邮递员中工作

Posted

技术标签:

【中文标题】cookie 中的访问令牌,但验证无法在 react.js(axios) 中检测到它,在邮递员中工作【英文标题】:Access token in cookies but validation can't detect it in react.js(axios), works in postman 【发布时间】:2021-08-25 04:08:45 【问题描述】:

所以我做了一个登录函数,它在 cookie 中生成一个访问令牌。但是当我对页面进行验证时,该页面没有检测到 cookie,在邮递员中它可以工作,但在反应中却没有。

这是我的代码,如果我的解释有点混乱,请见谅。

jwt.js 文件

const  sign, verify  = require('jsonwebtoken');

const createTokens = (user) => 
    const accessToken = sign(
         username: user.username, id: user.user_id , 
        'secret'
    );
    return accessToken;
;

const validateToken = (req, res, next) => 
    const accessToken = req.cookies['access-token']

    if (!accessToken) 
        return res.status(400).json(error: 'User not authenticated!')

    try 
         const validToken = verify(accessToken, 'secret')
         req.user = validToken;
         if(validToken) 
            req.authenticated = true
            return next();
         
     catch(err) 
        console.log(req.cookies);
        return res.status(400).json(error: err)
    
;

module.exports =  createTokens, validateToken ;

users.js 的路由

const express = require('express');
const router = express.Router();
const  Users  = require('../models');
const bcrypt = require('bcrypt');

const  createTokens, validateToken  = require('../controllers/jwt');

router.get('/', validateToken, async (req, res) => 
    const userList = await Users.findAll()
    res.json(userList);
);

router.get('/:id', validateToken, async (req, res) => 
    const id = req.params.id
    const user = await Users.findByPk(id);
    res.json(user);
);

router.post('/', validateToken, async (req, res) => 
    const  username, 
            email, 
            password, 
            first_name,
            last_name  = req.body;
    bcrypt.hash(password, 10).then((hash) => 
        Users.create(
            username: username,
            email: email,
            password: hash,
            first_name: first_name,
            last_name: last_name
        );
        res.json('User successfully added')
    );
);

router.post('/login', async (req, res) => 
    const  username, password  = req.body;

    const user = await Users.findOne( where: username: username);

    if(!user) res.status(400).json(error: `Username does not exist!`);

    bcrypt.compare(password, user.password).then((match) => 
        if(!match) res.status(400).json(error: 'Wrong password!')

        const accessToken = createTokens(user);

        res.cookie('access-token', accessToken, 
            maxAge: 60*60*24*30*1000, //30 days
            secure: process.env.NODE_ENV === 'production' ? true : false,
            httpOnly: process.env.NODE_ENV === 'production' ? true : false,
            sameSite: 'strict',
            path: '/'
        );

        user.password = undefined;

        res.json(accessToken);
    )
);

module.exports = router;

这是我在没有 validateToken 的情况下如何称呼它,我错过了什么?哈哈。现在真的很迷茫。

    const [ usersList, setUsersList ] = useState ([]);

    useEffect(() => 
      axios.get('http://localhost:4000/users').then((res) => 
        setUsersList(res.data)
      )
    , []);

【问题讨论】:

获取所有用户时是否已经登录? 登录后我可以使用邮递员获取所有用户,否则如果我不先登录,它会给出“用户未通过身份验证”。我的问题是我对如何从 cookie 中获取访问令牌并让页面知道我已通过身份验证来查看它感到困惑。(对不起,如果它令人困惑) 我的意思是在 reactjs 上 是的,我已经登录了,登录后我可以看到 cookie 有我的访问令牌,即使我导航到另一个页面,带有令牌的 cookie 也在那里。 【参考方案1】:

确保在使用 axios 调用端点时发送凭据。请参阅此答案:https://***.com/a/43178070/1712294 以检查如何操作。

【讨论】:

@madmeatballs,如果这对您有帮助,您可以接受答案,以便其他人知道问题已解决。

以上是关于cookie 中的访问令牌,但验证无法在 react.js(axios) 中检测到它,在邮递员中工作的主要内容,如果未能解决你的问题,请参考以下文章

黑名单/验证/生成 JWT 刷新令牌

使用访问令牌和刷新令牌保持身份验证

在身份验证期间使用 JWT 令牌反序列化 cookie 无法正确反序列化

MVC .NET cookie 身份验证系统通过令牌身份验证访问 Web Api

没有 cookie 的 IdentityServer4 外部身份验证

请求具有无效的身份验证凭据。预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据 automl