У меня возникли некоторые проблемы с пониманием этого кода.
У меня есть следующий 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});
})