我在尝试从烧瓶前哨应用程序的前端获取令牌时遇到问题。
要使用从前端到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']
您能指导我弄错我吗?
提前谢谢!
答案 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/flask_sentinel.py
文件CORS(app, origins=['http://192.168.1.y:3000','https://192.168.1.y:3000'])