在我的Angular2应用程序中,我试图使用密码和用户名凭据登录到后端服务器。到目前为止,在运行我的应用程序和登录时,我对chrome和safari没有任何问题。今天我第一次尝试在微软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:
        '^/': ~

断然的
最后的问题与交响乐有关。我们使用了nelmio cors config,但它没有设置头文件。不管怎样都能用。

最佳答案

确保你允许CRO

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方法,允许cro
然后在之后发送http动词(get,post,…)。
我的意思是:
angular - IE Edge-请求 header 授权不存在于Access-Control-Allow-Headers列表中-LMLPHP
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作为前端。
有了这个解决方案,cro就通过了。

10-08 02:29