Почему я получаю ошибку CORS, когда я установил Access-Control-Allow-Origin? - PullRequest
0 голосов
/ 04 апреля 2019

Проблема

Access-Control-Allow-Origin заголовка ответа соответствует заголовку запроса Origin, но я все еще получаю сообщение об ошибке Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://myappname.herokuapp.com/api/v1/products. (Reason: CORS request did not succeed).[Learn More]

Заголовки

ОтветЗаголовок

HTTP/1.1 308 PERMANENT REDIRECT
Connection: keep-alive
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: authorization, content-type
Access-Control-Allow-Methods: DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT
Access-Control-Allow-Origin: http://localhost
Content-Length: 311
Content-Type: text/html; charset=utf-8
Date: Thu, 04 Apr 2019 10:03:39 GMT
Location: http://mpappname.herokuapp.com/api/v1/products/
Server: waitress
Via: 1.1 vegur

Заголовок запроса

Host: mpappname.herokuapp.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Access-Control-Request-Method: POST
Access-Control-Request-Headers: authorization,content-type
Referer: http://localhost/admin/main/products/create
Origin: http://localhost
DNT: 1
Connection: keep-alive

Фон

Код, который генерирует заголовки, приведен ниже, но меня больше интересует понимание того, почему предпечатная проверка CORS отклоняет это,Это для api колбы с дизайном продуктов CRUD и аутентификацией на основе токенов.

Вырезанная версия

from flask_cors import CORS

def create_app(config_name):
    ...
    CORS(app, origins="http://localhost",
      allow_headers=["Content-Type", "Authorization", "Access-Control-Allow-Credentials"],
      supports_credentials=True)
    ...
    return app

Полная версия

from flask import Flask
from config import config
from flask_sqlalchemy import SQLAlchemy
from flask_cors import CORS
db = SQLAlchemy()

def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)

    db.init_app(app)
    CORS(app, origins="http://localhost",
      allow_headers=["Content-Type", "Authorization", "Access-Control-Allow-Credentials"],
      supports_credentials=True)

    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    from .api import api as api_blueprint
    app.register_blueprint(api_blueprint, url_prefix='/api/v1')

    return app

1 Ответ

0 голосов
/ 04 апреля 2019

Я запрашивал

http://mpappname.herokuapp.com/api/v1/products

вместо

http://mpappname.herokuapp.com/api/v1/products/

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

https://airbrake.io/blog/http-errors/308-permanent-redirect

Появление постоянного перенаправления 308 обычно не требует особого вмешательства пользователя.Все современные браузеры автоматически обнаружат код ответа 308 Permanent Redirect и автоматически обработают действие перенаправления на новый URI.Сервер, отправляющий код 308, также будет включать специальный заголовок Location как часть ответа, который он отправляет клиенту.Этот заголовок Location указывает новый URI, в котором можно найти запрошенный ресурс.Например, если клиент отправляет запрос метода HTTP POST в качестве попытки входа по URL-адресу https://airbrake.io, веб-сервер может быть настроен на перенаправление этого запроса POST на другой URI, например https://airbrake.io/login. В этом сценарии сервер может ответить кодом постоянного перенаправления 308 и включить в ответ заголовок Location: https://airbrake.io/login.Это сообщает пользовательскому агенту (браузеру), что данные запроса POST (данные для входа в систему) были получены сервером, но ресурс был постоянно перемещен в URI заголовка Location, равный https://airbrake.io/login.

...