Проблема CORS в конечной точке Flask-Sentinel / OAUT / Token - PullRequest
0 голосов
/ 09 января 2019

У меня возникают проблемы при попытке получить токен из моего приложения фляга-страж с помощью моего интерфейса.

Чтобы отправлять запросы AJAX с моего внешнего интерфейса на мой сервер Python Eve API, я использую модуль superagent .

При использовании базовой аутентификации у меня нет проблем с получением данных с моих конечных точек. Смотрите код ниже:

superagent
    .get( 'http://192.168.1.x:5000/endpoint' )
    .auth( this.params.username, this.params.password )
    .on( 'error', this.onError )
    .then( this.onSuccess );

Если я пытаюсь запросить токен для конечной точки /oauth/token с этим кодом:

superagent
    .post( 'http://192.168.1.x:5000/oauth/token' )
    .set( 'Content-Type', 'application/x-www-form-urlencoded' )
    .send( 'grant_type=password&client_id='+this.params.client_id+'&username='+this.params.username+'&password='+this.params.password )
    .on( 'error', this.onError )
    .then( this.onTokenReceived );

Я получаю ошибку CORS:

Access to XMLHttpRequest at 'http://192.168.1.x:5000/oauth/token' from origin 'http://192.168.1.y:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Вот настройки моего приложения (за исключением настроек базы данных и домена):

SENTINEL_X_DOMAINS           = ['http://192.168.1.y:3000']
SENTINEL_X_HEADERS           = ['Authorization','Content-type','If-Match','Access-Control-Allow-Origin']
SENTINEL_X_EXPOSE_HEADERS    = SENTINEL_X_HEADERS
SENTINEL_RESOURCE_METHODS    = ['GET','HEAD','PUT','PATCH','POST','DELETE','OPTIONS']
SENTINEL_PUBLIC_METHODS      = SENTINEL_RESOURCE_METHODS
SENTINEL_X_ALLOW_CREDENTIALS = True

X_DOMAINS           = ['http://192.168.1.y:3000']
X_ALLOW_CREDENTIALS = True
X_HEADERS           = ['Authorization','Content-type','If-Match','Access-Control-Allow-Origin']
RESOURCE_METHODS    = ['GET','HEAD','PUT','PATCH','POST','DELETE','OPTIONS']

Не могли бы вы подсказать мне, что я делаю неправильно?

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

В своем приложении Flask попробуйте установить в своем ответе заголовок «Access-Control-Allow-Origin», т. Е.

response.headers.add('Access-Control-Allow-Origin', '*')

Это, скорее всего, должно решить проблему.

0 голосов
/ 07 февраля 2019

Я разобрался, как это исправить, хотя я не полностью удовлетворен.

Вот шаги, за которыми я следовал:

  • Я раздвоил хранилище Flask Sentinel
  • Я установил Flas-CORS с Pip
  • Я отредактировал файл flask_sentinel/flask_sentinel.py, импортировав flask_cors
  • До этой строки Я вставил этот фрагмент кода:
CORS(app, origins=['http://192.168.1.y:3000','https://192.168.1.y:3000'])
  • Я вернулся в свой проект Eve и установил Flask-Sentinel через свой разветвленный репозиторий с Pip вместо исходного
0 голосов
/ 06 февраля 2019

Возможно, что из-за того, что тип содержимого не является текстовым / обычным, браузер отправляет запрос OPTIONS . и, как указано в сообщении об ошибке консоли, ответ не устанавливает заголовок ' Access-Control-Allow-Origin '.

Из документов Евы кажется, что вам необходимо установить переменную X_EXPOSE_HEADERS с помощью ['Access-Control-Allow-Origin'], которая:

"Позволяет сопровождающим API указывать, какие заголовки отображаются в CORS ответ. Допустимые значения: Нет или список имен заголовков. По умолчанию None. "

Браузер ожидает получения «Access-Control-Allow-Origin», то есть сбой. Попробуйте включить этот заголовок в ответ от API

...