#node.js
Вопрос:
Вот шаблон, который я использую : https://jasonwatmore.com/post/2020/05/13/node-mongo-api-with-email-sign-up-verification-authentication-forgot-password
И вот GitHub для этого: https://github.com/cornflourblue/node-mongo-signup-verification-api
Итак, у нас есть эти два маршрута:
router.post('/authenticate', authenticateSchema, authenticate);
router.post('/refresh-token', refreshToken);
И затем у этого есть два контроллера:
function authenticate(req, res, next) {
const { email, password } = req.body;
const ipAddress = req.ip;
accountService.authenticate({ email, password, ipAddress })
.then(({ refreshToken, ...account }) => {
setTokenCookie(res, refreshToken);
res.json(account);
})
.catch(next);
}
function refreshToken(req, res, next) {
const token = req.cookies.refreshToken;
const ipAddress = req.ip;
accountService.refreshToken({ token, ipAddress })
.then(({ refreshToken, ...account }) => {
setTokenCookie(res, refreshToken);
res.json(account);
})
.catch(next);
}
И это setTokenCookie
функция:
function setTokenCookie(res, token) {
// create cookie with refresh token that expires in 7 days
const cookieOptions = {
httpOnly: true,
expires: new Date(Date.now() 7*24*60*60*1000)
};
res.cookie('refreshToken', token, cookieOptions);
}
Внутри accountService
у меня есть эти функции, которые мы видели выше:
async function authenticate({ email, password, ipAddress }) {
const account = await db.Account.findOne({ email });
if (!account || !account.isVerified || !bcrypt.compareSync(password, account.passwordHash)) {
throw 'Email or password is incorrect';
}
// authentication successful so generate jwt and refresh tokens
const jwtToken = generateJwtToken(account);
const refreshToken = generateRefreshToken(account, ipAddress);
// save refresh token
await refreshToken.save();
// return basic details and tokens
return {
...basicDetails(account),
jwtToken,
refreshToken: refreshToken.token
};
}
async function refreshToken({ token, ipAddress }) {
const refreshToken = await getRefreshToken(token);
const { account } = refreshToken;
// replace old refresh token with a new one and save
const newRefreshToken = generateRefreshToken(account, ipAddress);
refreshToken.revoked = Date.now();
refreshToken.revokedByIp = ipAddress;
refreshToken.replacedByToken = newRefreshToken.token;
await refreshToken.save();
await newRefreshToken.save();
// generate new jwt
const jwtToken = generateJwtToken(account);
// return basic details and tokens
return {
...basicDetails(account),
jwtToken,
refreshToken: newRefreshToken.token
};
}
Как вы видите, когда я нажимаю authenticate
новую jwtToken
, refreshToken
созданную и использующую setTokenCookie(res, refreshToken);
функцию, мы храним refreshToken
ее внутри httpOnly
файла cookie, но jwtToken
в файле cookie не сохраняется!!! а также refreshToken
сохраняется в базе данных, чтобы получить учетную запись пользователя, когда я нажму refreshToken
маршрут …
Вопрос в том, где и как нам нужно сохранить jwtToken?
Если нам нужно отправить заголовки jwtToken
авторизации через, как мы можем получить к ним доступ, если мы нигде их не храним?
Нужно ли нам refreshToken
выбирать маршрут и получать новый jwtToken
каждый раз, когда нам нужно аутентифицировать пользователя?