Как интегрировать node-oidc-provider с SvelteKit

Вопрос или проблема

Я в замешательстве, как интегрировать oidc-provider конкретно с SvelteKit, и если у кого-то есть идеи, я был бы рад их услышать.

В основном, проблема заключается в том, что SvelteKit генерирует ответы другим способом. Стандартные вещи Node.js, такие как Express, используют модель промежуточного ПО, которая принимает и запрос, и ответ. Но SvelteKit этого не делает, он обрабатывает запрос и генерирует ответ.

Все идет хорошо, пока вы не начнете работать с отображениями форм с использованием oidc-provider и попытаетесь использовать SvelteKit. Взаимодействия требуют получения деталей с помощью чего-то вроде:

expressApp.get('/interaction/:uid', async (req, res) => {
  const details = await provider.interactionDetails(req, res);
  // ...
});

что, конечно, вы не можете тривиально сделать в SvelteKit, из-за отсутствия ответа вообще. Раздражает, что интеграция работает довольно хорошо, пока вы не начнете строить свои собственные пользовательские потоки.

Возможно, есть какая-то волшебная техника для этого, или, возможно, мне просто нужно отказаться от SvelteKit для взаимодействий (я могу использовать его для всего остального в приложении). Это печально.

Я полагаю, что как только я выберу конкретный адаптер, я смогу внедрить ответ в локальные события в SvelteKit, а затем получить его, но это будет работать только в продакшене, а не в разработке, что менее чем идеально с точки зрения опыта разработчика, поскольку почти никакая аутентификация никогда не будет работать в разработке.

Ответ или решение

Интеграция oidc-provider с SvelteKit действительно может вызывать некоторые трудности из-за различий в подходах к обработке запросов и ответов. SvelteKit использует иной подход, и поскольку у него нет традиционного middleware как в Express, вы должны обойти это ограничение. Вот шаги, которые помогут вам интегрировать oidc-provider в ваше приложение на SvelteKit.

Шаг 1: Установка зависимостей

Сначала убедитесь, что у вас установлены необходимые зависимости:

npm install oidc-provider
npm install express

Шаг 2: Создание сервера Express

Создайте сервер Express, который будет обрабатывать запросы для oidc-provider. Для этого создайте файл, например, oidc-server.js.

const express = require('express');
const { Provider } = require('oidc-provider');

const app = express();
const port = 3001; // Порт для OIDC сервера

const clients = [{
  client_id: 'your-client-id',
  client_secret: 'your-client-secret',
  redirect_uris: ['http://localhost:3000/callback'],
  response_types: ['code'],
  grant_types: ['authorization_code'],
}];

const configuration = {
  clients,
  // другие конфигурации
};

const provider = new Provider('http://localhost:3001', configuration);

app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// Операции OIDC
app.use('/oidc/', provider.callback());

app.listen(port, () => {
  console.log(`OIDC provider is running on http://localhost:${port}`);
});

Шаг 3: Реализация взаимодействий

Так как SvelteKit не поддерживает традиционное взаимодействие с ответами, вам придется реализовать маршруты для обработки взаимодействий. Например, вы можете создать два роута: один для получения деталей взаимодействия, а другой для отправки форм.

app.get('/interaction/:uid', async (req, res) => {
  const details = await provider.interactionDetails(req, res);
  // Здесь вы можете отобразить форму для пользователя
});

app.post('/interaction/:uid', async (req, res) => {
  const result = await provider.interactionResult(req, res);
  // Здесь обработка результата взаимодействия
});

Шаг 4: Встраивание SvelteKit

Ваша SvelteKit-приложение будет отправлять запросы к этому Express-серверу. Создайте страничный маршрут для обработки, например, src/routes/interaction/[uid].svelte:

<script context="module" lang="ts">
  export async function load({ params }) {
    const res = await fetch(`http://localhost:3001/interaction/${params.uid}`);
    const details = await res.json();
    return { props: { details } };
  }
</script>

<script>
  export let details;
</script>

<form action={`http://localhost:3001/interaction/${details.uid}`} method="POST">
  <!-- Здесь вы можете использовать details для генерации формы -->
  <button type="submit">Подтвердить</button>
</form>

Шаг 5: Настройка CORS

Не забудьте настроить CORS, если ваши серверы находятся на разных доменах. Вы можете использовать пакет cors для Express:

const cors = require('cors');

app.use(cors({
  origin: 'http://localhost:3000', // Сайт SvelteKit
  credentials: true
}));

Конфигурация для разработки

Вы правы, разработка может стать сложной. Чтобы улучшить опыт разработки, вы можете создать конфигурацию, которая будет запускать и SvelteKit, и Express одновременно. Используйте такие инструменты, как concurrently для этого.

Заключение

Это базовая структура, которая поможет вам интегрировать oidc-provider с SvelteKit. Имейте в виду, что вам, возможно, придется добавить дополнительные функции, такие как обработка ошибок и более сложные сценарии взаимодействий. SvelteKit и oidc-provider могут работать вместе, но иногда вам придется писать дополнительные куски кода для обеспечения корректной работы пользовательских потоков.

Оцените материал
Добавить комментарий

Капча загружается...