Как программно аутентифицировать пользователя в 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);
}