Как я могу отправлять защищенные запросы API из приложения SvelteKit, не показывая ключи API на стороне клиента?
Я использую Supabase для нового приложения Sveltekit с этим шаблоном
В настоящее время я передаю ключи Supabase на стороне клиента, например:
const supabase = createClient(
import.meta.env.VITE_SUPABASE_URL,
import.meta.env.VITE_SUPABASE_ANON_KEY
)
Каков самый простой способ создать безопасный бэкэнд / API, чтобы приложение могло получать контент из Supabase, не показывая ключ Supabase на стороне клиента?
Есть ли в Sveltekit какие-либо функции, которые позволяют мне это делать? Или мне нужно будет интегрировать серверную часть, например Rails?
1 ответ
SvelteKit поддерживает серверный код в двух основных местах:
Код для них никогда не будет доступен браузеру; только результаты. Кроме того, любые выполненные сетевые вызовы не будут видны клиенту, поскольку все они происходят на сервере (для случаев, когда ключи API встроены в URL-адрес). В
locals
свойство каждого API - хорошее место для обмена конфиденциальными данными (например, ключами API) со всеми серверными частями.
Общая рекомендация - проксировать вызовы внешнего API с помощью локальных конечных точек:
- Получите локальную конечную точку (вместо SvelteKit со страниц SvelteKitпрямого вызова внешнего API, такого как Supabase). Вы можете получить конечную точку из двух разных мест на странице:
- Инициализируйте внешний API в синглтоне.
- Вызовите внешний API из конечной точки и верните результаты на страницу.
Заметки:
- Конечные точки SvelteKit - это обобщение бессерверных лямбда-функций. (См. Варианты Netlify или AWS )
- Любые модули NPM, используемые в конечных точках / перехватчиках, должны быть devDependencies.
- рекомендуется (например, vs axios), особенно внутри.
load()
предоставляет специальную версиюfetch()
который кэширует вызовы со стороны сервера, чтобы на стороне клиента можно было повторно использовать результаты. - Шаг № 2 в основном предназначен для поддержки бессерверных сред, таких как Netlify.