Php 飞行前标题不符合预期
我正在尝试从Angular 8应用程序向Laravel 5.8 Passport API发送请求,但没有成功。我的意思是,只有有限的成功。当我将Angular请求中的withCredientials设置为true时,飞行前标头尝试查看API是否会返回正确的标头,包括Access Control Allow Credentials:true,但响应显示没有此类标头,即使我将其设置为后端 如果我没有设置凭据,响应头将包括访问控制允许凭据:true,正如预期的那样,但我也需要在飞行前响应中使用该响应 我曾尝试将飞行前请求案例封装在单独的块中,使用Php 飞行前标题不符合预期,php,angular,laravel,cors,preflight,Php,Angular,Laravel,Cors,Preflight,我正在尝试从Angular 8应用程序向Laravel 5.8 Passport API发送请求,但没有成功。我的意思是,只有有限的成功。当我将Angular请求中的withCredientials设置为true时,飞行前标头尝试查看API是否会返回正确的标头,包括Access Control Allow Credentials:true,但响应显示没有此类标头,即使我将其设置为后端 如果我没有设置凭据,响应头将包括访问控制允许凭据:true,正如预期的那样,但我也需要在飞行前响应中使用该响应
if(!$\u服务器['REQUEST\u METHOD']=='OPTIONS')
并显式设置头响应,但也没有成功。
另一个注意事项是,从邮递员那里请求相同的URL正如预期的那样有效(因为邮递员不会干扰CORS)
正在从以下代码段激发请求:
await this.http.post(this.logInEndPoint, credentials, {
headers: this.httpHeaders,
withCredentials: true
}).subscribe(async res => {
...
CORS中间件如下所示:
$res->headers->set('Content-Type','application/json');
$res->headers->set('Access-Control-Allow-Origin','http://127.0.0.1:4200');
$res->headers->set('Access-Control-Allow-Credentials','true');
$res->headers->set('Access-Control-Max-Age','60');
$res->headers->set('Access-Control-Allow-headers','x-requested-with,Content-Type,origin,authorization,accept,client-security-token');
$res->headers->set('Access-Control-Allow-Methods','GET,POST,PUT,DELETE,OPTIONS');
如果(!$\u服务器['REQUEST\u METHOD']='OPTIONS'){
$next($res);
}否则{
返回$res;
}
这就是我定义CORS中间件使用的地方
api.php
Route::middleware('web','json.response','cors')->group(function(){
路由::post('login','AuthController@login');
...
我希望“成功登录”消息,但从源“”获得对“”处XMLHttpRequest的访问权已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:响应中“访问控制允许凭据”标头的值为“”,当请求的凭据模式为“包括”时,该值必须为“真”。凭据模式为reqXMLHttpRequest启动的uests由withCredentials属性控制。在开发者工具中。经过几天的努力,我终于解决了这个问题。 如果我必须总结与Laravel API相关的大多数问题,我会指出后端的头设置。对我来说,它在自定义CORS中间件中的某个地方。
老实说,我不确定上面的配置到底出了什么问题(我猜是在Allow Methods标题中),但我想与大家分享一下我是如何解决这个问题的。
首先,我删除了我制作的所有定制中间件。我开始使用该中间件,仅为API的组添加它。在那里,我更改了默认配置。我将allowOrigins设置为Angular服务器URI,并将allowedMethods设置为我期望使用的请求。发布CORS配置文件后,我确保在上运行我的Angular应用程序127.0.0.1(不在本地主机上)。与我在Laravel服务器上所做的相同。
在同一个IP地址上运行两个应用程序并使用新的CORS中间件后,一切都顺利运行,没有问题