我在localhost:8001/my_app/api/
上运行了一个rest API,我有apache设置来从localhost/my_app/api
反向代理它。这很好。
为了拥有对api执行任何操作的权限,它需要我的会话Cookie,我的csrftoken
Cookie 和一个X-CSRFToken
HTTP标头。我已将adapters/application.js
配置如下:
import Ember from 'ember';
import DRFAdapter from './drf';
export default DRFAdapter.extend({
headers: Ember.computed(function() {
return {
'X-CSRFToken': Ember.get(document.cookie.match(/csrftoken\=([^;]*)/), '1'),
};
}).volatile(),
ajax: function(url, method, hash) {
hash = hash || {}; // hash may be undefined
hash.crossDomain = true;
hash.xhrFields = {withCredentials: true};
return this._super(url, method, hash);
}
});
如果我执行ember build -prod
并将dist
目录的内容复制到/var/www/myApp/
,则apache会为我的应用程序提供服务,而且工作正常。
当我尝试使用ember-cli的内置开发服务器时遇到问题。我从api收到403错误。事实证明,虽然X-CSRFToken
标题正在发送我的Cookie中没有。如果我查看我的chrome开发人员工具,它会显示我有两个Cookie - 它们根本不在请求标头中。他们都来自localhost,所以我有点困惑。
另外,我目前在休息后端设置上有CORS。以下是我目前收到的标题:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost:4200
我认为,因为allow-credentials == true
和allow-origin != *
应该允许使用Cookie。叹息。
这是我的API_HOST和contentSecurityPolicy:
if (environment === 'development') {
ENV.APP.LOG_TRANSITIONS = true;
ENV.APP.API_HOST = "http://localhost"
ENV.contentSecurityPolicy = {
'default-src': "'none'",
'script-src': "'self' 'unsafe-eval' localhost",
'font-src': "'self'",
'connect-src': "'self' localhost",
'img-src': "'self'",
'style-src': "'self'",
'media-src': "'self'"
};
}
如上所示,api请求是通过我的反向代理发送的。我使用ember serve --proxy
同时尝试了http://localhost:80/
和http://localhost:8001/
,但两人都没有帮助。我也尝试使用和不使用各种代理值来设置我的开发ENV.API_HOST = 'http://localhost:8001/';
。
这个编辑,构建,部署,刷新我的浏览器,测试和&重复过程真的慢,变老真的快。
有人可以向我解释如何让ember-cli开发服务器正确访问我的其他API吗?