我正在使用AngularJS编写一个网站,该网站与服务器上的API通信并提供一些信息。 登录部分我应该发送一个包含电子邮件,密码等的http帖子请求。它在谷歌Chrome和IE上工作正常。我的意思是它发送post请求并获取令牌。但是在FireFox中我检查了网络,它发送了一个OPTION请求并获得了200但是之后它没有发送任何帖子!因此我的登录不会消失,我也不会得到任何令牌。
我应该为这种情况做些什么?
App.config:
$httpProvider.defaults.withCredentials = true;
$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8;';
$httpProvider.interceptors.push('httpRequestInterceptor');
发送请求的服务功能:
this.loginEmail = function(f_email, f_pass, deviceModel, deviceOs) {
var data = $.param({
email: f_email,
password: f_pass,
device_model: deviceModel,
device_os: deviceOs
});
return $http({
method: "POST",
url: app.baseUrl + 'login_email/' + app.storeID + '/' + app.device_id,
data: data
}).success(function(response){
return response.status;
});
/*return $http.post(app.baseUrl + 'login_email/' + app.storeID + '/' + app.device_id, data).success(function(response){
return response.status;
}).error(function(response){
return response.status;
});*/
};
服务器凭据为真
CORS似乎很好,因为我可以得到请求
编辑: 这是另一件可能与此问题有关的事情: 在Chrome中,当我登录获取请求时,它会发送令牌标头 但是对于Post它没有
httpRequestInterceptor:
app.factory('httpRequestInterceptor', function ($cookieStore) {
return {
request: function (config) {
config.headers['Authorization'] = $cookieStore.get('Auth-Key');;
config.headers['Accept'] = 'application/json;odata=verbose';
return config;
}
};
});
答案 0 :(得分:1)
问题是由apache配置引起的。
之前:
Access-Control-Allow-Headers: "authorization"
后:
Access-Control-Allow-Headers: "authorization, Content-type"
更新:
在CORS请求中,如果API需要一些特殊标头,如Auhtorization Token,则必须返回所有OPTIONS请求200(ok!),否则无论如何上述解决方案都无法正常工作。 这是代码:
if($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
header( "HTTP/1.1 200 OK" );
exit();
}
更新2: 这个OPTIONS问题发生在Django的REST框架中!对于OPTIONS,它会通过追求整个api来评估请求,如果它有问题,即使你有发送请求所需的权限,你也会收到错误!
示例:
假设有一个像api / profile这样的网址需要一个Authorization标头来响应个人资料详细信息。您想发送跨域请求以获取它。您设置了正确的标题并单击!您将收到未经授权的错误!为什么?由于预先发出的请求(OPTIONS)不包含任何特殊标头并且浏览器将其发送到服务器,因此具有REST框架的服务器通过检查整个请求(具有授权标头的get请求)来评估OPTIONS请求,但OPTIONS没有任何请求授权标题,因此此请求未经授权!
发展解决方案: 此问题可以通过客户端或后端解决。前端开发人员可以在chrome上安装以下插件:
Allow-Control-Allow-Origin:*
后端开发人员可以安装一个在Django Framework上启用CORS的软件包。