在我的Angular 2应用程序中,我尝试使用密码和用户名凭据登录我的后端服务器。到目前为止,我在运行我的应用程序和登录时没有遇到Chrome和Safari的问题。今天我第一次尝试在Microsoft IE Edge中运行该应用程序。但是,当我尝试登录时,我收到以下错误:
SEC7123:Request header Authorization was not present in the Access-Control-Allow-Headers list.
我使用angular 2+来运行http请求。这是我的登录功能。任何想法修复可能是什么?
loginHttp(username: string, password: string): any {
let headers: any = new Headers();
let data: any = null;
headers.append("Authorization", "Basic " + btoa(username + ":" + password));
headers.append("Content-Type", "application/x-www-form-urlencoded");
return this.http.post(this.authService.getUrl()+ '/login', data, {headers: headers})
.map(res => res.json());
}
更新
检查后端(我们使用symphony)我们在标题中包含CORS:
defaults:
allow_origin: ["%cors_allow_origin%"]
allow_methods: ["GET", "POST", "PUT", "DELETE", "LINK", "UNLINK"]
allow_headers: ["Content-Type", "Authorization", "X-Employee-Id"]
max_age: 3600
paths:
'^/': ~
分辨
最终的问题与Symphony有关。我们使用了nelmio cors配置,但它没有设置标头。无论如何都让它工作了。
答案 0 :(得分:1)
确保您允许CROS
res.setHeader('Access-Control-Allow-Origin', '*');
// methods you wish to allow
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
注意:我在此示例中使用了Express。
documentation 有所改变。 希望它有所帮助。
<强>更新强>
在使用Symfony之前,我们遇到了同样的问题。 我找到的解决方案是:
OPTIONS
方法,允许CROS 这是我的意思的图像:
RestListner的代码:
class RestListener
{
/**
* Constructor
*/
public function __construct()
{
}
public function onKernelResponse(FilterResponseEvent $event)
{
if (!$event->isMasterRequest())
return;
$responseHeaders = $event->getResponse()->headers;
$responseHeaders->set('Access-Control-Allow-Headers', 'origin, content-type, accept, x-wsse, set-cookie, x-sessid');
$responseHeaders->set('Access-Control-Allow-Origin', '*');
$responseHeaders->set('Access-Control-Expose-Headers', '*');
$responseHeaders->set('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS');
$request = $event->getRequest();
$method = $request->getRealMethod();
if (strtoupper($method) === 'OPTIONS') {
header('Access-Control-Allow-Headers: origin, content-type, accept, x-wsse, set-cookie, x-sessid');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Expose-Headers', '*');
header('Access-Control-Allow-Methods: POST, GET, PUT, DELETE, OPTIONS');
die(json_encode(array(
'message' => 'Accepted',
'status' => 202,
)));
}
}
}
我们使用symfony作为后端,Angular 2.x作为前端。
通过该解决方案,CROS即可通过。