Angular CORS误差仅来自角度,而非非非';尖角的

Angular CORS误差仅来自角度,而非非非';尖角的,angular,cors,Angular,Cors,我对一个新Angular6应用程序出现的错误感到非常困惑。我们有一个用ASP.NET Core 2编写的现有API,并且我们一直在使用这个API,而没有任何问题,它来自一个用Typescript编写的chrome扩展,该扩展发布了如下数据: let login: any = { username: options.userName, password: options.password }; let body: string = JSON

我对一个新Angular6应用程序出现的错误感到非常困惑。我们有一个用ASP.NET Core 2编写的现有API,并且我们一直在使用这个API,而没有任何问题,它来自一个用Typescript编写的chrome扩展,该扩展发布了如下数据:

    let login: any = {
        username: options.userName,
        password: options.password
    };

    let body: string = JSON.stringify(login);
    return fetch(`${environment.jwtApiUrl}/api/token`,
        {
            method: "POST",
            headers: {
                'Accept': 'application/json',
                "Content-Type": "application/json"
            },
            body: body
        });
我们现在正在使用与Ionic 4 Angular应用程序完全相同的API,如下所示:

export class AuthenticationService {
  constructor(
    private http: HttpClient,
    private storage: Storage) { }

  public isLoggedIn(): boolean {
    return this.storage.get("token") != null;
  }

  public async login(username: string, password: string): Promise<boolean> {

    let login: any = {
      username: username,
      password: password
    };

    let body: string = JSON.stringify(login);

    var result = await this.http.post<any>(`${environment.jwtApiUrl}/api/token`, body).toPromise();
    if (result && result.token) {
      this.storage.set("token", result.token);
      return true;
    };

    return false;
  }

  logout() {
    // remove user from local storage to log user out
    this.storage.remove('token');
  }
}
导出类身份验证服务{
建造师(
私有http:HttpClient,
专用存储:存储{}
public isLoggedIn():布尔值{
返回此.storage.get(“令牌”)!=null;
}
公共异步登录(用户名:string,密码:string):承诺{
允许登录:任意={
用户名:用户名,
密码:密码
};
let body:string=JSON.stringify(login);
var result=wait this.http.post:对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“access control Allow Origin”标头。因此,不允许访问源“”


为什么我们仅仅从Angular而不是chrome扩展中得到这个结果?chrome扩展也在进行跨域调用,除了在API上启用cors之外,还有其他方法可以解决这个问题吗?

我认为如果不在API上启用cors或使用代理,您将无法解决这个问题


有人猜测你的Chrome扩展工作正常,可能是扩展没有相同的(安全性)浏览器的限制。

我也有同样的问题,但我不想更改服务器中的CORS设置。我在开发时通过创建api bridge node.js应用程序并在服务器中运行该应用程序来解决此问题。node具有在文件(即服务器)中设置CORS的能力然后,我使用node发出api请求,并将其传递给我的angular应用程序(在开发过程中)。是这样还是像前面的回答所说的那样为您启用CORS api(或服务器)。

CORS仅由浏览器强制执行,这就是为什么其他任何东西都不会影响CORS问题

飞行前选项请求是在发出实际的POST请求之前检查服务器是否接受CORS请求的请求。如果选项请求发现服务器有必要的POST请求,它将发出POST请求。如果没有,它甚至不会发出POST请求(如果它已经从选项请求中知道它没有服务器的权限,那么为什么要通过发出请求来浪费时间)

有两种方法可以解决此问题:

(1) 将相关CORS头添加到服务器响应中,确保服务器接受PUT POST DELETE GET选项(可能还有HEAD)

(2) 使用代理重写URL。浏览器向同一域和端口上的端点发出请求(从而避免CORS),为Angular应用提供服务的服务器将请求重写到不同的域和端口。对于开发环境,您可以使用
--proxy config
标志以这种方式启动webpack以代理请求(网页包由引擎盖下的Angular CLI使用)。在npm启动脚本中使用
--proxy config
标志。您需要在prod服务器上复制此配置

对于(2),在开发服务器上创建一个名为proxy.json的文件,如下所示:

{
  "/api": {
    "target": "http://localhost:9000",
    "secure": false
  }
}
并使用以下命令启动Angular CLI dev服务器:

ng serve --proxy-config ./proxy.json
此配置基本上表示代理指向目标域和端口的路径中以/api开头的任何请求


正如我所说,您需要在prod服务器上重复此操作,这取决于您在prod中使用的服务器。您还需要确保所有API调用都以路径中的/API开头。

发生的事情是,Angular的HttpClient向任何资源发送POST请求之前,它会使用选项请求ping它。在我的情况下,我所做的只是在我发送帖子的同一个端点上取消选项请求。您可以看到解释
ng serve --proxy-config ./proxy.json