Flask-sentinel /oauth/token端点CORS问题:前端请求token遇跨域错误
排查Flask-Sentinel OAuth Token端点的CORS问题
看起来你的普通Eve API端点CORS配置正常,但/oauth/token这个Flask-Sentinel提供的OAuth端点没正确返回CORS头——这是因为Eve的内置CORS处理只针对它自己管理的资源路由,而Flask-Sentinel添加的OAuth路由是独立的Flask路由,并未继承Eve的CORS设置。下面是具体的排查和解决步骤:
1. 先确认问题本质:测试OPTIONS预检请求
浏览器发送POST请求前会先发送OPTIONS预检请求,你可以用curl手动测试,看服务器是否返回正确的CORS头:
curl -X OPTIONS \ -H "Origin: http://192.168.1.y:3000" \ -H "Access-Control-Request-Method: POST" \ -H "Access-Control-Request-Headers: Content-Type" \ http://192.168.1.x:5000/oauth/token
如果响应头里没有Access-Control-Allow-Origin,那就是这个端点的CORS配置缺失,接下来看解决方法。
2. 用Flask-CORS为OAuth端点单独配置CORS
Eve的CORS配置不覆盖第三方路由,所以我们需要用Flask-CORS中间件专门处理/oauth/*路径:
步骤1:安装Flask-CORS
pip install flask-cors
步骤2:在应用初始化代码中添加CORS配置
修改你的Eve应用启动代码:
from flask_cors import CORS from eve import Eve from flask_sentinel import ResourceOwnerPasswordCredentials # 初始化Eve应用 app = Eve() # 为OAuth相关端点配置CORS CORS(app, resources={ r"/oauth/*": { "origins": "http://192.168.1.y:3000", "allow_headers": ["Content-Type", "Authorization"], "supports_credentials": True, "methods": ["GET", "POST", "OPTIONS"] } }) # 初始化Flask-Sentinel ResourceOwnerPasswordCredentials(app) if __name__ == '__main__': app.run()
这个配置会专门针对/oauth开头的路径启用CORS,匹配你的前端域名和所需的请求头。
3. 修复前端请求的参数格式问题
你的前端代码里用了&(HTML转义的&),在JavaScript里直接用&即可,避免参数解析错误:
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错误的直接原因,但可能导致请求参数无效,进而引发其他问题。
4. 验证配置是否生效
重新启动服务器后,再用之前的curl命令测试OPTIONS请求,确认响应头包含Access-Control-Allow-Origin: http://192.168.1.y:3000,然后再测试前端请求,应该就能解决CORS错误了。
内容的提问来源于stack exchange,提问作者Andrea Silvestri
相关产品推荐
相关产品推荐

