Flask-Sentinel / oauth / token端点CORS问题

时间:2019-01-09 14:15:29

标签: python flask oauth eve

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

要使用从前端到Python Eve API服务器的AJAX请求,请使用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 :(得分:0)

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

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

  

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

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

答案 1 :(得分:0)

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

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

那应该最有可能解决问题。

答案 2 :(得分:0)

尽管我不完全满意,但我已经找到解决方法。

这是我遵循的步骤:

  • 我已经分叉了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项目,并使用Pip而不是原始版本通过派生的存储库安装了Flask-Sentinel