проблема с хранилищем jwtToken и как отправить его вместе с запросом

#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 каждый раз, когда нам нужно аутентифицировать пользователя?