Как программно аутентифицировать пользователя в Auth.js?

У меня есть Django-приложение с аутентифицированными (вошедшими в систему) пользователями.

У меня есть еще одно приложение (Svelte), использующее Auth.js (https://authjs.dev) для аутентификации, в настоящее время настроенное на github/facebook/linkedin.

Теперь я хочу отправить пользователя из приложения Django в приложение Svelte и автоматически (i) создать пользователя в приложении Svelte, если он не существует, и (ii) войти в него в приложении Svelte.

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

Я застрял на том этапе, когда пользователь попадает в приложение Svelte и мне нужно создать сессию. Есть ли в Auth.js какой-нибудь способ сделать это, не обращаясь к «провайдеру»?

Я не уверен, как вы поддерживаете пользователей в бэкенде. Ваше приложение Django и Svelet должны ссылаться на одну и ту же таблицу пользователей на authjs. В этом случае достаточно просто передать заголовки auth.

Приложение Django генерирует подписанный, защищенный токен и перенаправляет пользователя в приложение Svelte, передавая токен как часть URL или тела POST. Приложение Svelte проверяет токен с помощью Django.

Для реализации этого используйте безопасный метод генерации токена в Django. Вы можете использовать itsdangerous, встроенный модуль подписи Django, или JWTs.

В конечной точке SSO вашего приложения Svelte (routes/api/sso/+server.ts) создайте сессию для пользователя, используя управление сессиями в Auth.js.

Сессии Auth.js опираются на файлы cookie. После создания или обновления пользователя в приложении Svelte вы можете использовать встроенные в Auth.js файлы cookie для управления сессией.

Вот измененные коды:

import { redirect } from '@sveltejs/kit';
import { verifyTokenWithDjango } from '$lib/auth'; // Token validation helper
import { prisma } from '$lib/server/prisma'; // Database helper
import { createSession } from '$lib/server/auth'; // Auth.js session helper

export async function GET({ url, cookies }) {
    // Extract query parameters
    const token = url.searchParams.get('token');
    const next = url.searchParams.get('next') || '/';

    // Validate inputs
    if (!token) throw new Error('SSO token is required');
    if (!next) throw new Error('The "next" parameter is required');

    // Step 1: Validate the token with Django
    const userInfo = await verifyTokenWithDjango(token);
    if (!userInfo) {
        throw new Error('Invalid or expired SSO token');
    }

    // Extract user info from the validated token
    const { email, username, name, image } = userInfo;

    // Step 2: Create or update the user in database
    const user = await prisma.user.upsert({
        where: { email },
        update: { username, name, image },
        create: { email, username, name, image }
    });

    // Step 3: Create a session using Auth.js - compatible logic
    const { sessionToken, sessionExpires } = await createSession(user, cookies);

    // Step 4: Set the session token in the cookies
    cookies.set('authjs.session-token', sessionToken, {
        path: '/',
        httpOnly: true,
        secure: true,
        sameSite: 'strict',
        expires: sessionExpires
    });

    // Step 5: Redirect to next page
    return redirect(307, next);
}

Вернуться на верх