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

And*_*tri 5 python oauth flask eve

我有问题试图用我的前端从我的flask-sentinel应用程序获取令牌.

要从我的前端到我的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 );
Run Code Online (Sandbox Code Playgroud)

如果我尝试/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 );
Run Code Online (Sandbox Code Playgroud)

我收到一个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.
Run Code Online (Sandbox Code Playgroud)

以下是我的应用程序的设置(省略数据库和域设置):

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']
Run Code Online (Sandbox Code Playgroud)

你能指导我得到我做错的事吗?

先感谢您!

0e1*_*val 0

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

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

“允许 API 维护者指定在 CORS 响应中公开哪些标头。允许的值为:无或标头名称列表。默认为无。”

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