【发布时间】:2015-07-22 13:25:14
【问题描述】:
为清晰起见编辑:
使用 python/Flask REST-API 为 ExtJS 应用程序提供安全端点(使用基本身份验证)。 CORS 已启用。在我对 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 托管,所有身份验证都使用 WSGIPassAuthorization On 指令传递给 wsgi 应用程序。
不用说,我有点困惑。如果检测到 401 错误,我不应该总是得到登录对话框吗?
【问题讨论】:
-
对于 Firefox,我尝试设置 NTLM 设置,但这没有做任何事情,这是预期的,因为我们正在运行 Apache Web 服务。
-
你好!我确实知道基本身份验证直接通过所有浏览器上的 API(python/flask)工作,所以它肯定与 Ajax 有关。不过最近没有太多时间研究它。
-
我有一个类似的问题(使用 JQuery 而不是 ExtJS。)我已经在同源和跨源上尝试了相同的请求,并比较了正在发送的请求标头。它们是相同的,除了:同源有“Origin”,但跨域有“X-Requested-With”。 (不确定是 Ajax 还是浏览器的问题。)
-
您可能想使用 Firebug 或 Chrome 开发者工具来检查您的请求标头,看看存在哪些差异。理论 A:请求标头差异之一是导致此问题的原因。理论 B:浏览器只是在处理其 CORS 时以不同方式处理基本身份验证,并跳过用户提示。无论哪种方式:一种可能的解决方法可能是有一个显式登录页面,然后通过自己注入 Authentication 标头来跳过提示。
-
你好!你有这方面的运气吗?我终于可以回到这个话题了。
标签: extjs basic-authentication preflight flask-cors