Как мой express сервер читает req.cookies, установленный как 'httpOnly'? Как бы я прочитал это в моем интерфейсе? - PullRequest
0 голосов
/ 13 января 2020

У меня возникли некоторые проблемы с пониманием этого кода.

У меня есть следующий express маршрут входа в систему, он отправляет токен доступа в качестве ответа, а затем в своем интерфейсе я сохраняю его в кулинарии ie, и отправляет refre sh токен как ... (?) <- я не понимаю эту фазу </p>

    app.post('/login', async (req, res) => {
    const { email, password} = req.body;

    try{
        //find user in database if not then error
        const user = fakeDB.find(user => user.email === email);
        if(!user) throw new Error("User doesnt exist");
        //compare the passwords and see if they match send error if not
        const valid = await compare(password, user.password);
        if(!valid) throw new Error("Password not corect");
        //create refresh and access token if its correct
        const accesstoken =  createAccessToken(user.id);
        const refreshtoken = createRefreshToken(user.id);
        //put the refreshtoken in the "database"
        user.refreshtoken = refreshtoken;
        console.log(fakeDB);
        //send token refreshtoken as a cookie, and accesstoken as a regular response
        sendRefreshToken(res, refreshtoken);
        sendAccessToken(res, req, accesstoken);

    }catch (err){
        res.send({
            error: `${err.message}`
        })
    }
})

Функции для отправки маркера обновления и токена доступа следующие

    const sendAccessToken = (res , req, accesstoken) => {
    res.send({
        accesstoken,
        email: req.body.email

    })
}

const sendRefreshToken = (res, refreshtoken) => {
     res.cookie("refreshtoken", refreshtoken, {
        httpOnly: true,
         path: '/refresh_token'
     })

}

И затем у меня есть маршрут / refresh_token для обновления sh моего токена, и вот где я потерян, я вижу, что `` const token = req.cookies.refreshtoken извлекается из повара ie, но ... как это так? происходит, если повар ie является httponly, разве он не должен быть читабельным? Проблема в том, что я не понимаю, как получить это значение refreshtoken, если я вызываю этот маршрут из внешнего интерфейса. Он каким-то образом получает его в бэкэнде, если я использую почтальон, но в моем интерфейсе я понятия не имею, как его получить.

    app.post('/refresh_token', (req, res) => {
    const token = req.cookies.refreshtoken
    //if no token in request
    if(!token) return res.send({accesstoken : ''});
    //if we have a token we verify it
    let payload = null;
    try{
        payload = verify(token, process.env.REFRESH_TOKEN_SECRET);
    }catch(err){
        return res.send({accesstoken: ''});
    }
    //if token is valid check if user exist
    const user = fakeDB.find(user => user.id === payload.userId)
    if(!user) return res.send({ accesstoken: ''});
    //if user exists check if refreshtoken exist on user

     if(user.refreshtoken !== token){
         return res.send({accesstoken: ''}) 
     }


    //if token exist create a new Refresh and Accestoken
    const accesstoken = createAccessToken(user.id);
    const refreshtoken =  createRefreshToken(user.id);
    user.refreshtoken = refreshtoken;
    //send new refreshtoken and accesstoken
    sendRefreshToken(res, refreshtoken);
    return res.send({accesstoken});
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...