Проблема с базовой авторизацией

ОТРЕДАКТИРОВАНО для ясности:

Использование python/Flask REST-API для предоставления безопасных конечных точек (с использованием базовой аутентификации) для приложения ExtJS. КОРС включен. Все прекрасно работало во всех моих тестах с Safari. Решил протестировать другие браузеры (IE, Chrome и Firefox), в результате чего я продолжаю получать ошибку 401 и диалоговое окно входа в систему отсутствует.

Я нашел следующую запись в блоге: http://mortoray.com/2014/04/09/allowing-unlimited-access-with-cors/, в котором предлагалось добавить следующий фрагмент кода, чтобы обеспечить покрытие всех заголовков для всех конечных точек:

@app.after_request
def add_cors(resp):
    """ Ensure all responses have the CORS headers. This ensures any failures are also accessible
        by the client. """
    resp.headers['Access-Control-Allow-Origin'] = request.headers.get('Origin','*')
    resp.headers['Access-Control-Allow-Credentials'] = 'true'
    resp.headers['Access-Control-Allow-Methods'] = 'POST, OPTIONS, GET'
    resp.headers['Access-Control-Allow-Headers'] = request.headers.get(
        'Access-Control-Request-Headers', 'Authorization' )
    # set low for debugging
    if app.debug:
        resp.headers['Access-Control-Max-Age'] = '1'
    return resp

Я добавил это в свой код API в надежде, что это сработает, но, похоже, это ничего не изменило.

API размещается через Apache с использованием mod_wsgi, и вся аутентификация передается приложению wsgi с использованием директивы WSGIPassAuthorization On.

Излишне говорить, что я немного смущен. Разве я не должен всегда получать диалоговое окно входа в систему, если была обнаружена ошибка 401?


person horcle_buzz    schedule 11.05.2015    source источник
comment
Для Firefox я попытался установить параметры NTLM, но это ничего не дало, чего и следовало ожидать, поскольку мы запускаем веб-службу Apache.   -  person horcle_buzz    schedule 13.05.2015
comment
Привет! Я знаю, что базовая аутентификация работает напрямую через API (python/flask) во всех браузерах, так что это определенно связано с Ajax. Хотя в последнее время не было времени разбираться.   -  person horcle_buzz    schedule 29.05.2015
comment
У меня аналогичная проблема (используя JQuery, а не ExtJS). Я пробовал один и тот же запрос как с тем же источником, так и с перекрестным источником, и сравнивал отправляемые заголовки запросов. Они одинаковы, за исключением того, что у одного и того же происхождения есть Origin, а у перекрестного происхождения есть X-Requested-With. (Не уверен, виноват ли Ajax или браузер.)   -  person Bampfer    schedule 29.05.2015
comment
Возможно, вы захотите использовать Firebug или Chrome Developer Tools, чтобы проверить заголовки запросов и посмотреть, какие существуют различия. Теория A: это вызвано одним из различий в заголовках запросов. Теория B: браузеры просто по-разному обрабатывают Basic Auth, если это CORS, и пропускают приглашение пользователя. В любом случае: возможный обходной путь может состоять в том, чтобы иметь явную страницу входа, а затем пропустить приглашение, внедрив заголовок аутентификации самостоятельно.   -  person Bampfer    schedule 29.05.2015
comment
Привет! Вам повезло с этим? Я ПРОСТО наконец-то могу вернуться к этому.   -  person horcle_buzz    schedule 24.07.2015
comment
Судя по всему, виноват «Аякс». Базовая аутентификация через прямые вызовы API работает нормально. Через Ajax не так много ... Все тесты, которые я провожу, тоже имеют одно и то же происхождение.   -  person horcle_buzz    schedule 26.07.2015
comment
К вашему сведению, я попробовал предложенный выше обходной путь, явно предоставляя заголовок аутентификации с каждым запросом (stackoverflow.com/questions/5507234/). Не похоже, чтобы помочь. Добавление xhrFields: {withCredentials: true} немного помогло с Chrome, но сломало Firefox. Но, возможно, какая-то комбинация того, что я пытаюсь сделать, сработает.   -  person Bampfer    schedule 27.07.2015
comment
Если вы отключите Chrome с помощью аргумента --disable-web-security, все будет работать. Похоже, у Firefox нет подобного флага (для этого есть открытый запрос Bugzilla).   -  person horcle_buzz    schedule 27.07.2015
comment
У меня есть еще одно приложение, которое без проблем сталкивается со сторонним API, использующим Ajax CORS. Единственное отличие состоит в том, что сторонний API не использует базовую HTTP-аутентификацию. Я могу в конечном итоге сделать что-то похожее на то, что они сделали.   -  person horcle_buzz    schedule 27.07.2015


Ответы (1)


В итоге я просто переместил свои приложения ExtJS и API на один и тот же сервер (используя Apache mod_alias для приложения ExtJS и директиву WSGIScriptAlias ​​из mod_wsgi для приложения Flask). Работает как шарм и никаких проблем с CORS. Несмотря на ужасное решение для Chrome, я думаю, что для Firefox нет исправления, и я даже не смотрю на IE. У меня определенно есть дела поважнее.

person horcle_buzz    schedule 31.07.2015
comment
И последнее замечание: это будет работать ТОЛЬКО при использовании SSL-сертификатов при использовании аутентификации .htaccess в Apache или при использовании безопасной аутентификации LDAP через Apache (которая, конечно, также должна использовать SSL через Purt 443). - person horcle_buzz; 26.10.2015