【问题标题】:Angular 2 Basic Authenticatin CORSAngular 2 基本身份验证 CORS
【发布时间】:2017-04-11 20:36:47
【问题描述】:

我正在尝试使用 Angular 对具有基本 HTTP 身份验证的“普通”Api 进行简单的 HTTP-Api-Call。 我现在的问题是,浏览器说:“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)。”

如果我从 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:'-Header 已设置...

这是我的 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 请求的服务器响应头:

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 和网络,但没有找到解决方案...

非常感谢!

【问题讨论】:

  • 错误信息是否有更多细节?
  • 这是 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 不允许我认为的请求......但我不明白为什么......

标签: authentication angular cors


【解决方案1】:

这些标头需要由服务器随响应一起发送。用请求从客户端发送它们是没有意义的。

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

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

【讨论】:

  • mh, ok... 但是 Firefox RESTClient 中没有问题但在 Angular2 中没有问题的原因是什么?我没有对服务器的任何访问权限...所以我认为这不是问题...您在 RESTClient 的响应标头中看到,Access-Control-Allow-Origin"、"*" 由服务器...但是如果我通过 Angular2 发送它,则未设置此标头。我使用来自 Angular 的响应标头更新了我的问题?
  • 很难知道你的系统到底发生了什么,但如果 Mozilla "RESTClient" 是一个浏览器插件,它可能不会受到与你的 JS 相同的限制。
  • 是的,这是一个浏览器插件...嗯,我真的不知道该怎么做才能让它工作:/
  • 你控制服务器吗?
  • 也许他们不希望您按照您的意图使用服务器。为了解决 CORS 问题,您始终可以做的是,在您自己的服务器上提供类似的 API,并将请求从您的服务器转发到您实际想要访问的服务器。 CORS 限制仅适用于浏览器客户端。
猜你喜欢
  • 2016-10-12
  • 2013-09-01
  • 2016-11-17
  • 1970-01-01
  • 2018-01-24
  • 2019-04-25
  • 2018-06-27
  • 2017-11-24
相关资源
最近更新 更多