Файлы cookie не устанавливаются даже при включенном CORS в приложении Flask - PullRequest
0 голосов
/ 24 июня 2019

Обратите внимание: таких вопросов много, но ни один из них не помог мне, поэтому я и задаю это.

Мой REST API - это приложение Flask.Моя /login конечная точка использует JWT и устанавливает токены доступа и обновления в файлах cookie клиента.

Я использую Flask на 127.0.0.1:5000, а внешний интерфейс на 127.0.0.1:8080.

Код сервера

@auth.api(
    http_path='/login',
    http_method='POST',
)
def login(email, password):
    # ...
    access_token = create_access_token(identity=user.id, fresh=True, expires_delta=app.config['JWT_ACCESS_TOKEN_EXP'])
    refresh_token = create_refresh_token(identity=user.id, expires_delta=app.config['JWT_REFRESH_TOKEN_EXP'])

    resp = jsonify({'login': True})
    set_access_cookies(resp, access_token)
    set_refresh_cookies(resp, refresh_token)
    # ...
    return resp

В моем приложении включена функция CORS:

from flask_cors import CORS
# ...
cors = CORS()

def create_app():
    app = Flask(__name__)
    # ...
    cors.init_app(app)
    # ...
    return app

Код клиента

$.ajax({
    method: "POST",
    url: "http://127.0.0.1:5000/login",
    data: JSON.stringify({email: 'myemail', password: 'mypassword'}),
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    success: function (data) {
        console.log('logged in!');
    }
});

Проблема

Файлы cookie не устанавливаются в FirefoxХром ни Edge.Однако я могу видеть файлы cookie в заголовках ответа при использовании инструментов разработчика браузера, но в разделе «Хранение» в разделе «Файлы cookie» ничего не отображается.

enter image description here

Iперепробовал несколько вещей:

  • настройка cors=CORS(supports_credentials=True) на бэкэнде и установка xhrFields:{ withCredentials: true} на интерфейсе.
  • настройка crossDomain: true на интерфейсе
  • выполнениеУбедитесь, что файлы cookie не блокируются настройками браузера
  • , работающими специально для 127.0.0.1 вместо localhost

Нужен ли какой-нибудь прокси для внешнего интерфейса?Должно быть более простое решение.

1 Ответ

1 голос
/ 25 июня 2019

Итак, после многих головных болей я понял, что не так. Это частично моя вина, но также и потенциальная ошибка.

Я использую библиотеку flask-jwt-extended для моей аутентификации JWT; Есть некоторые переменные окружения, касающиеся JWT, значения которых используются в функции set_access_cookies.

Как правило, ваша конфигурация приложения Flask является местом для этих переменных, однако я выбрал для использования отдельного файла .env и загрузки из него переменных окружения. Проблема заключалась в том, что для таких вещей, как MY_VAR=False, MY_VAR получило бы строковое значение "False" вместо логического флага.

Это особенно плохо проявилось для JWT_COOKIE_SECURE - значение этой переменной используется в функции set_access_cookies, которая сама использует функцию set_cookie для объекта Request - , если вы передаете строку для поле Secure, оно блокирует cookie, и ваш браузер, скорее всего, проигнорирует его.

Итак, искаженное печенье будет выглядеть примерно так:

('Set-Cookie', 'access_token_cookie=yourtoken; Domain=localhost.example.com; Secure; HttpOnly; Path=/')

Обратите внимание, что поле Secure является пустым, когда оно должно быть либо логическим, либо отсутствовать вообще (если false).

Надеюсь, это поможет!

...