87 lines
2.8 KiB
JavaScript
87 lines
2.8 KiB
JavaScript
import { SvelteKitAuth } from '@auth/sveltekit';
|
|
import Credentials from '@auth/sveltekit/providers/credentials';
|
|
import { db, users } from '$lib/server/db.js';
|
|
import { eq } from 'drizzle-orm';
|
|
import { verifyPassword, createMoodleUser } from '$lib/server/auth.js';
|
|
import { moodleLogin } from '$lib/server/moodle.js';
|
|
|
|
export const { handle, signIn, signOut } = SvelteKitAuth({
|
|
providers: [
|
|
//локальный аккаунт (email + пароль)
|
|
Credentials({
|
|
id: 'local',
|
|
name: 'Локальный аккаунт',
|
|
credentials: {
|
|
email: { label: 'Email', type: 'email' },
|
|
password: { label: 'Пароль', type: 'password' },
|
|
},
|
|
async authorize({ email, password }) {
|
|
if (!email || !password) return null;
|
|
const user = db.select().from(users).where(eq(users.email, email)).get();
|
|
if (!user || user.authType !== 'local' || !user.passwordHash) return null;
|
|
if (!verifyPassword(password, user.passwordHash)) return null;
|
|
|
|
return {
|
|
id: user.id,
|
|
name: user.username,
|
|
email: user.email,
|
|
authType: 'local',
|
|
};
|
|
},
|
|
}),
|
|
|
|
//вход через Moodle
|
|
Credentials({
|
|
id: 'moodle',
|
|
name: 'Moodle',
|
|
credentials: {
|
|
username: { label: 'Логин Moodle', type: 'text' },
|
|
password: { label: 'Пароль', type: 'password' },
|
|
},
|
|
async authorize({ username, password }) {
|
|
if (!username || !password) return null;
|
|
try {
|
|
//проверяем логин/пароль через Moodle API (moodle.js)
|
|
const mUser = await moodleLogin(username, password);
|
|
//создаём или находим пользователя в нашей БД
|
|
const userId = createMoodleUser(mUser.moodleId, mUser.username, mUser.email);
|
|
const user = db.select().from(users).where(eq(users.id, userId)).get();
|
|
return {
|
|
id: user.id,
|
|
name: user.username,
|
|
email: user.email,
|
|
authType: 'moodle',
|
|
moodleId: user.moodleId,
|
|
};
|
|
} catch {
|
|
return null; //неверный логин/пароль
|
|
}
|
|
},
|
|
}),
|
|
|
|
],
|
|
|
|
callbacks: {
|
|
//добавляем в JWT токен
|
|
jwt({ token, user }) {
|
|
if (user) {
|
|
token.id = user.id;
|
|
token.authType = user.authType;
|
|
token.moodleId = user.moodleId ?? null;
|
|
}
|
|
return token;
|
|
},
|
|
//передаём в объект сессии
|
|
session({ session, token }) {
|
|
session.user.id = token.id;
|
|
session.user.authType = token.authType;
|
|
session.user.moodleId = token.moodleId ?? null;
|
|
return session;
|
|
},
|
|
},
|
|
|
|
pages: {
|
|
signIn: '/login',
|
|
},
|
|
trustHost: true,
|
|
}); |