【问题标题】:Flask-sentinel /oauth/token endpoint CORS issueFlask-sentinel /oauth/token 端点 CORS 问题
【发布时间】:2019-06-04 08:17:36
【问题描述】:

我在尝试使用前端从我的烧瓶哨兵应用程序获取令牌时遇到问题。

为了将 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']

你能指导我了解我做错了什么吗?

提前谢谢你!

【问题讨论】:

标签: python flask oauth eve


【解决方案1】:

虽然我并不完全满意,但我已经解决了这个问题。

这是我遵循的步骤:

  • 我已经分叉了Flask Sentinel 存储库
  • 我已经用 Pip 安装了Flas-CORS
  • 我已经通过导入 flask_cors 编辑了 flask_sentinel/flask_sentinel.py 文件
  • this line之前我已经插入了这段代码:
CORS(app, origins=['http://192.168.1.y:3000','https://192.168.1.y:3000'])
  • 我回到了我的 Eve 项目并通过我的分叉存储库安装了 Flask-Sentinel,使用 Pip 而不是原来的存储库

【讨论】:

  • 您可以导入ResourceOwnerPasswordCredentials,将其子类化,而不是分叉和编辑flask-sentinel,在您的子类的__init__ 方法中,您可以执行CORS 初始化,然后运行超类的__init__ 方法。然后,您可以直接使用您的子类而不是 ResourceOwnerPasswordCredentials
【解决方案2】:

在您的 Flask 应用中,尝试在响应中设置“Access-Control-Allow-Origin”标头,即,

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

这应该很可能解决问题。

【讨论】:

  • 感谢您的回答,但我不能在 Eve 中做类似的事情。
【解决方案3】:

有可能因为内容类型不是 text/plain,浏览器发出了OPTIONS 请求。并且如控制台错误中所述,响应未设置“Access-Control-Allow-Origin”标头。

Eve's docs 看来,您似乎需要使用 ['Access-Control-Allow-Origin'] 设置 X_EXPOSE_HEADERS 变量:

“允许 API 维护人员指定在 CORS 响应。允许的值为:无或标题名称列表。 默认为无。”

浏览器希望收到“Access-Control-Allow-Origin”,因此失败。 尝试在来自 API 的响应中允许此标头

【讨论】:

  • 感谢您的回答,我测试了该解决方案,但不幸的是它不起作用。我设法使它以另一种方式工作。有时间我会尽快回复的。
猜你喜欢
  • 2018-10-16
  • 2017-09-25
  • 2015-04-12
  • 1970-01-01
  • 2021-03-29
  • 2018-07-06
  • 2020-07-17
  • 2023-03-28
  • 2017-01-04
相关资源
最近更新 更多