Как передать cookies в запросе в FETCH API

0 голосов
Turov_D в категории Как сделать...
Сейчас используется следующий код для интеграции с seldon :

import { InputTable, InputTables, InputVariables, OutputTable, DataType, DataKind, UsageType } from "builtIn/Data";

import {fetch, Request, Response, Headers} from "builtIn/Fetch";

let login_b = InputTable.Get(0, "BASIS_LOGIN"),

password_b = InputTable.Get(0, "BASIS_PASSWORD"),

    login_t = InputTable.Get(0, "TORGI_LOGIN"),

password_t = InputTable.Get(0, "TORGI_PASSWORD"),

inn = InputTable.Get(0, "inn"),

rnt = InputTable.Get(0, "rnt");

const body = {

    "response": "",

    "cookies": "",

    "e": ""

};

try {

  fetch('https://basis.myseldon.com/api/rest/login', {

    method: 'POST',

    body: 'UserName=' + encodeURIComponent(login_b) + '&Password=' + encodeURIComponent(password_b),

    headers: new Headers({'Content-Type': 'application/x-www-form-urlencoded'})

  })

  .then(response =>{

    const cookies = response.headers.get('Set-Cookie');

      body.cookies = cookies;

      return fetch('https://basis.myseldon.com/api/rest/get_company_owners?inn=$'+encodeURIComponent(inn)+'&type=1&source=1', {

        method: 'GET',

        headers: new Headers({'Cookie': cookies })

    });

  })

  .then(response => response.json())

  .then(data => {

    body.response = data;

    OutputTable.Append();

    OutputTable.Set(0, JSON.stringify(body));

    return fetch('https://basis.myseldon.com/api/rest/logout');

  })

  .catch(e => {

    body.e = e;

    OutputTable.Append();

    OutputTable.Set(0, JSON.stringify(body));

  });

} catch(e) {

  body.e = e;

  OutputTable.Append();

  OutputTable.Set(0, JSON.stringify(body));

}

Первый запрос возвращает куки (проверено), я их передаю в заголовок при втором запросе, но ответ от seldon: "Пользователь не авторизован", как будто он не получает куки в заголовке. В чем может быть проблема?

Ответ: 1 шт.

0 голосов
Алексей Гришинев

Добрый день.

В Loginom, на данный момент, нет функции encodeURIComponent, но мы обратим внимание разработчиков на нее. 

Turov_D

Добрый день! На запрос с encodeURIComponent в ответ приходят куки, а вот во втором запросе они как будто не передаются: 

return fetch('https://basis.myseldon.com/api/rest/get_company_owners?inn=$'+encodeURIComponent(inn)+'&type=1&source=1', {

        method: 'GET',

        headers: new Headers({'Cookie': cookies })

    });

Александр Музалев
encodeURIComponent работает

У меня есть пример использования авторизации с Cookie
 

(async () => {

    try {

        const gitlab_base_url = InputVariables.Items.gitlab_base_url.Value,

              gitlab_sign_in_url = `${gitlab_base_url}/users/sign_in`,

              gitlab_auth_url = `${gitlab_base_url}/users/auth/ldapmain/callback`,

              gitlab_user = InputVariables.Items.user.Value,

              gitlab_password = InputVariables.Items.password.Value,

              _gitlab_session_regex = /(_gitlab_session=.*?);/,

              token_regex = /<input.*?name="authenticity_token"\s+value="(.*?)"/;

        // Страница логина

        let response = await fetch(gitlab_sign_in_url);

        let cookie = response.headers.get("Set-Cookie");

        let _gitlab_session = _gitlab_session_regex.exec(cookie)[1]; // идентификатор временной сессии

        let authenticity_token = token_regex.exec(await response.text())[1];

        // Авторизация через LDAP, получение идентификатора персонифицированной сессии

        let body = `utf8=%E2%9C%93&authenticity_token=${encodeURIComponent(authenticity_token)}&username=${encodeURIComponent(gitlab_user)}&password=${encodeURIComponent(gitlab_password)}`;

        response = await fetch(gitlab_auth_url, {

            method: "POST",

            headers: {

                "content-type": "application/x-www-form-urlencoded",

                "cookie": _gitlab_session

            },

            redirect: "manual", // Иначе выполняется редирект 302 на страницу gitlab_base_url, а нужно получить cookie из этого ответа

            body: body

        });

        cookie = response.headers.get("Set-Cookie");

        _gitlab_session = _gitlab_session_regex.exec(cookie)[1]; // идентификатор персонифицированной сессии        

        

        // Запрос API - получить список проектов, в которых я владелец

        response = await fetch(`${gitlab_base_url}/api/v4/projects/?owned=1`, {

            headers: {

                "cookie": _gitlab_session

            }

        });

        let my_own_projects = await response.json();

        

        console.log(JSON.stringify(my_own_projects));       

    } catch (e) {

        console.error(e);

    }

})()
...