1
import { OAuth2RequestError } from "oslo/oauth2";
2
import { oauth2Client, prisma } from "../../../utils/auth";
4
export default defineEventHandler(async (event) => {
5
const query = getQuery(event);
6
const code = query.code?.toString() ?? null;
7
const state = query.state?.toString() ?? null;
8
const storedState = getCookie(event, "moodle_oauth_state") ?? null;
10
if (!code || !state || !storedState || state !== storedState) {
16
const data = await oauth2Client.validateAuthorizationCode(code!, {
17
credentials: process.env.MOODLE_SECRETKEY,
18
authenticateWith: "request_body",
21
const userInfo: any = await $fetch(process.env.MOODLE_USERINFO!, {
24
"Content-Type": "application/x-www-form-urlencoded",
26
body: new URLSearchParams({
27
access_token: data.access_token,
30
const userInfoData = JSON.parse(userInfo);
31
// console.log(userInfoData);
32
let existingUser = await prisma.user.findFirst({
34
username: userInfoData.username,
38
existingUser = await prisma.user.update({
40
username: userInfoData.username,
43
email: userInfoData.email,
44
fio: `${userInfoData.lastname} ${userInfoData.firstname} `,
45
group: userInfoData.city || "",
48
const session = await lucia.createSession(existingUser.id, {});
52
lucia.createSessionCookie(session.id).serialize()
54
return sendRedirect(event, "/");
56
existingUser = await prisma.user.create({
58
username: userInfoData.username,
59
email: userInfoData.email,
60
fio: `${userInfoData.lastname} ${userInfoData.firstname}`,
61
group: userInfoData.city || "",
64
const session = await lucia.createSession(existingUser.id, {});
68
lucia.createSessionCookie(session.id).serialize()
70
return sendRedirect(event, "/");
72
if (e instanceof OAuth2RequestError) {
73
// see https://www.rfc-editor.org/rfc/rfc6749#section-5.2
74
const { request, message, description } = e;
77
// return sendRedirect(event, "/");