Сеанс Flask не может создавать файлы cookie (с использованием заголовков ответа set-cookie) в приложении переднего плана реагирования - PullRequest
0 голосов
/ 31 октября 2019

Проблема

Я пытаюсь использовать сеанс на стороне сервера (сохраненный в PSQL db), но они не сохраняются между запросами.

Описание

I 'Я запускаю мое приложение локально и состоит из двух частей.

  1. Бэкэнд работает на MY_IP: 2501
  2. Фронтенд работает на MY_IP: 3000

Теперь, насколько я понимаю, Flask сохраняет сеанс в таблице «сеансов» PSQL (так как мы храним сеансы на стороне сервера), и идентификатор из этой конкретной строки отправляется клиенту вформа заголовка ответа, то есть "Set-Cookie".

Каждая вещь, описанная выше, работает, но когда внешний интерфейс (или браузер) React получает этот заголовок, он не создает из него cookie, из-за которогоидентификатор сеанса не сохраняется во внешнем интерфейсе, и затем внешний интерфейс не может отправить его на внутренний сервер, из-за чего он не может извлекать связанные данные сеанса, что приводит к пустому сеансу каждый раз.

:(

Материал, который я пробовал до сих пор ..

  1. Готово разрешить все типы заголовков при возврате ответа.

    `response.headers.add('Access-Control-Allow-Headers', "Origin, X-Requested-With, Content-Type, Accept, x-auth")`
    
  2. Завершено разрешение атрибута заголовка withCredentials как из внешнего интерфейса, так и из внутреннего интерфейса.

  3. Удалены параметры HttpOnly из сеанса с помощью свойства конфигурации "SESSION_COOKIE_HTTPONLY"

  4. Закончена установка «SESSION_COOKIE_DOMAIN» так же, как интерфейс

ПРИМЕЧАНИЕ

  1. Если я вызываю мой API через POSTMAN, сеанс сохраняется какcookie сохраняется в POSTMAN.

  2. Если я запускаю приложение в chrome --disable-web-security, то это также работает.

1 Ответ

0 голосов
/ 06 ноября 2019

Только необходимая конфигурация:

  1. Отправьте запрос (REST / GraphQL) с заголовком withCredentials = true.
  2. Добавление Access-Control-Allow-Credentials = true заголовков из бэкэнда.

On Axios (Frontend REST API).

import axios from 'axios';

export const restApi = axios.create({
  baseURL: urlBuilder.REST,
  withCredentials: true
});

restApi.interceptors.request.use(
  function(config) {
    config.headers.withCredentials = true;   # Sending request with credentials
    return config;
  },
  function(err) {
    return Promise.reject(err);
  }
);

На Apollo (Frontend GraphQL)

import {
  ApolloClient,
  ApolloLink
} from 'apollo-boost';

const authLink = new ApolloLink((operation, forward) => {
  operation.setContext({
    fetchOptions: {
      credentials: 'include' .         # Sending request with credentials
    }
  });
  return forward(operation);
});

На Python-Flask (Backend)

@app.after_request
def middleware_for_response(response):
    # Allowing the credentials in the response.
    response.headers.add('Access-Control-Allow-Credentials', 'true')
    return response
...