所以我知道那里有很多 CORS 帖子,我只是添加它们,但我找不到任何可以帮助我的答案。所以我正在构建一个依赖于我的 php api 的 Angular 4 应用程序。在本地工作没问题,当我将其与应用程序一起扔到域上时app.example.com
,以及 APIapi.example.com
,我无法登录,因为我收到以下错误:
XMLHttpRequest 无法加载http://api.example.com/Account/Login http://api.example.com/Account/Login。
对预检请求的响应未通过访问控制检查:否
请求中存在“Access-Control-Allow-Origin”标头
资源。起源 'http://app.example.com http://app.example.com' 因此不允许
使用权。
我的 php 代码如下所示:
$http_origin = $_SERVER['HTTP_ORIGIN'];
$allowed_domains = array(
'http://example.com',
'https://example.com',
'http://app.example.com',
'https://app.example.com',
'http://www.example.com',
'https://www.example.com'
);
if (in_array(strtolower($http_origin), $allowed_domains))
{
// header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Origin: $http_origin");
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Max-Age: 86400');
}
// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
header("Access-Control-Allow-Headers: Authorization, Content-Type,Accept, Origin");
exit(0);
}
我的 Angular 帖子如下所示:
public login(login: Login): Observable<LoginResponse> {
let headers = new Headers();
headers.append('Content-Type', 'application/x-www-form-urlencoded');
headers.append('Authorization', 'Basic ' + btoa(login.Username + ':' + login.Password));
return this.http.post(this.apiBaseUrl + '/Account/Login', "grant_type=client_credentials", { headers: headers })
.map(response => {
// code
});
}
如果我通过邮递员运行请求(这不会影响 CORS),我会得到:
{ "error": "invalid_client", "error_description": "Client credentials were not found in the headers or body" }
我尝试将原点设置为 '*
' 只是为了测试并看看这是否是问题的核心,但它仍然以同样的方式失败。
Edit只是根据以下信息进行更新。更改标头中的大小写没有效果,并且从 if 语句中提取代码也没有效果。
我通过告诉我的实时应用程序转到本地 api 来调试 php,并且 php 正在按预期工作。它设置标头并将其放入每个 if 语句中。
编辑拍摄2我真的可以在这方面得到一些帮助,如果有人有任何想法,我将非常感激。
编辑拍摄3如果我在 .htaccess 而不是 php 中设置所有标头内容,它就会让我通过。但是,现在我陷入了上面列出的错误,这是我在使用邮递员时总是遇到的错误,但现在是在使用实际网站时遇到的错误。
{"error":"invalid_client","error_description":"Client credentials were not found in the headers or body"}
我的响应标题是这样的
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:authorization, content-type, accept, origin
Access-Control-Allow-Methods:GET, POST, OPTIONS
Access-Control-Allow-Origin:*
一旦我让它工作,我会将其从 * 更改为仅我的域。但现在我将其保留为*。
我的标题按要求。