Angular 2基本身份验证CORS

4
我正在试图使用Angular对具有基本HTTP身份验证的“普通”Api进行简单的HTTP-Api调用。 我的问题是,浏览器显示:“跨源请求被阻止:同源策略禁止读取外部资源“...”(原因:缺少CORS标头'Access-Control-Allow-Origin')。”。
如果我从Mozilla的“RESTClient”发起请求,一切正常。这是服务器返回的响应头,如果我从RESTClient发起请求:
Status Code: 200 OK
Age: 0
Cache-Control: proxy-revalidate, proxy-revalidate
Connection: Keep-Alive
Content-Length: 698
Content-Type: text/xml; charset=UTF-8
Date: Mon, 28 Nov 2016 06:52:57 GMT
access-control-allow-credentials: true
access-control-allow-origin: *

如您所见,'access-control-allow-origin:'头部已设置...

这是我的angular2方法:

// hole die Header für die Api-Aufrufe
    getHeaders() {
        let username = this.variables.getUsername();
        let password = this.variables.getPassword();
        let headers =  new Headers();
        //headers.append("Content-Type", "text/xml");
        headers.append("Access-Control-Allow-Origin", "*");
        headers.append("Access-Control-Allow-Credentials", "true"); 
        headers.append("Authorization", "Basic " + btoa(username + ":" + password));
        headers.append("Access-Control-Allow-Methods", "GET, HEAD, OPTIONS, POST, PUT, DELETE");
        headers.append("Content-Type", "application/x-www-form-urlencoded");
        let options = new RequestOptions({headers: headers});
        console.log(JSON.stringify(options));
        return options;
    }

    // Api-Calls    
    getStatus() {
        return this.http.get(this.variables.getUrl() + 'status2.html', this.getHeaders())
        //return this.http.get(this.localURL + 'status.json')
            .map((res: Response) => res.json())
            .catch(this.handleError);
    }

以下是Angular2请求的服务器响应标头:
这是服务器的响应标头,针对Angular2请求。
OPTIONS /api/status2.html HTTP/1.1
Host: ...
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Access-Control-Request-Method: GET
Access-Control-Request-Headers: authorization
Origin: http://localhost:3000
Connection: keep-alive

有人能指导我正确的方向或给我一个正确的答案吗?我在stackoverflow和网络上搜索了,但没有找到解决方法...

非常感谢!


错误信息中有更多的细节吗? - Günter Zöchbauer
这是Firefox中的完整错误信息(德语): Quellübergreifende (Cross-Origin) Anfrage blockiert: Die Gleiche-Quelle-Regel verbietet das Lesen der externen Ressource auf '...'. (Grund: CORS-Kopfzeile 'Access-Control-Allow-Origin' fehlt)。所以我认为Firefox没有允许该请求... 但我不明白为什么... - Junias
1个回答

3

这些头信息需要由服务器在响应中发送。从客户端随请求发送它们是没有意义的。

    headers.append("Access-Control-Allow-Origin", "*");
    headers.append("Access-Control-Allow-Credentials", "true"); 

如果您正在使用 withCredentials: true,那么 * 对于 Access-Control-Allow-Origin 来说是不够的。服务器需要回应客户端请求的精确 URL(协议、主机、端口)。

很难知道您的系统到底发生了什么,但如果Mozilla的“RESTClient”是浏览器插件,则可能不受JS相同的限制。 - Günter Zöchbauer
是的,这是一个浏览器插件... 嗯,我真的不知道该怎么做才能让它工作 :/ - Junias
你控制这个服务器吗? - Günter Zöchbauer
也许他们不希望你按照你的意图使用服务器。 解决CORS问题的方法是,在自己的服务器上提供类似的API,并将请求从你的服务器转发到实际想要访问的服务器。CORS限制仅适用于浏览器客户端。 - Günter Zöchbauer
我的意思是,也许我需要问问他们。但是我知道另外两种解决方案,基于Java(Android应用程序),使用完全相同的API...总之,你不知道我可以在客户端做什么来使它工作吗? ;) - Junias
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接