Секретная настройка в Nuxt
В настройках проекта есть значения,
которые нельзя показывать браузеру:
ключи, токены, пароли. Их хранят
в runtimeConfig без блока
public. Такие поля доступны
на сервере, но не попадают
в клиентский бандл.
Публичная настройка apiBase
уже могла встречаться в проекте:
её видит и страница. Секрет
apiSecret объявляют отдельно,
чтобы его знал только сервер.
В nuxt.config.ts добавим
поле верхнего уровня runtimeConfig:
export default defineNuxtConfig({
runtimeConfig: {
apiSecret: '',
},
});
Значение для разработки задают
в .env. Префикс NUXT_
обязателен, имя настройки
пишут заглавными буквами:
NUXT_API_SECRET=dev-token
В API-обработчике настройки читают
через useRuntimeConfig.
Если секрет не задан, можно
прервать работу функцией createError
с кодом 500. Секрет
не возвращают в JSON: иначе
он сразу утёк бы клиенту.
Страницы apiSecret не читают.
export default defineEventHandler(() => {
const config = useRuntimeConfig();
if (!config.apiSecret) {
throw createError({
statusCode: 500,
statusMessage: 'Secret is not configured',
});
}
return {
status: 'ok',
};
});
При пустой настройке клиент
получит ошибку. При заданном
NUXT_API_SECRET ответ
содержит только status,
без значения токена. При желании
тот же apiSecret можно
сравнить с заголовком запроса,
но главное - читать его только
здесь, на сервере.
Сделайте API-обработчик,
который отказывается работать,
если apiSecret в конфигурации
пустой.
Проверьте поведение с заданным
NUXT_API_SECRET и после
его удаления из .env:
должна появиться серверная ошибка.