learning_network_protocols/src/auth.js

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,
});