codecheck

Форк
0
/
callback.get.ts 
80 строк · 2.4 Кб
1
import { OAuth2RequestError } from "oslo/oauth2";
2
import { oauth2Client, prisma } from "../../../utils/auth";
3

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;
9

10
  if (!code || !state || !storedState || state !== storedState) {
11
    throw createError({
12
      status: 400,
13
    });
14
  }
15
  try {
16
    const data = await oauth2Client.validateAuthorizationCode(code!, {
17
      credentials: process.env.MOODLE_SECRETKEY,
18
      authenticateWith: "request_body",
19
    });
20

21
    const userInfo: any = await $fetch(process.env.MOODLE_USERINFO!, {
22
      method: "POST",
23
      headers: {
24
        "Content-Type": "application/x-www-form-urlencoded",
25
      },
26
      body: new URLSearchParams({
27
        access_token: data.access_token,
28
      }),
29
    });
30
    const userInfoData = JSON.parse(userInfo);
31
    // console.log(userInfoData);
32
    let existingUser = await prisma.user.findFirst({
33
      where: {
34
        username: userInfoData.username,
35
      },
36
    });
37
    if (existingUser) {
38
      existingUser = await prisma.user.update({
39
        where: {
40
          username: userInfoData.username,
41
        },
42
        data: {
43
          email: userInfoData.email,
44
          fio: `${userInfoData.lastname} ${userInfoData.firstname} `,
45
          group: userInfoData.city || "",
46
        },
47
      });
48
      const session = await lucia.createSession(existingUser.id, {});
49
      appendHeader(
50
        event,
51
        "Set-Cookie",
52
        lucia.createSessionCookie(session.id).serialize()
53
      );
54
      return sendRedirect(event, "/");
55
    }
56
    existingUser = await prisma.user.create({
57
      data: {
58
        username: userInfoData.username,
59
        email: userInfoData.email,
60
        fio: `${userInfoData.lastname} ${userInfoData.firstname}`,
61
        group: userInfoData.city || "",
62
      },
63
    });
64
    const session = await lucia.createSession(existingUser.id, {});
65
    appendHeader(
66
      event,
67
      "Set-Cookie",
68
      lucia.createSessionCookie(session.id).serialize()
69
    );
70
    return sendRedirect(event, "/");
71
  } catch (e) {
72
    if (e instanceof OAuth2RequestError) {
73
      // see https://www.rfc-editor.org/rfc/rfc6749#section-5.2
74
      const { request, message, description } = e;
75
    }
76
    console.log(e);
77
    // return sendRedirect(event, "/");
78
    // unknown error
79
  }
80
});
81

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.