代码之家  ›  专栏  ›  技术社区  ›  potato

在Angular应用程序和访问控制中发送cookie允许源站处于开发模式

  •  0
  • potato  · 技术社区  · 6 年前

    我正在写一个运行在 https://app.example.com:4202 . 我也有一个运行在 https://app2.example.com:4203 https://example.com

    在每个后端php页面上,我都有一个测试,检查用户是否有权访问页面内容:

    if(!isset($_SESSION["id"])){
        http_response_code(403);
        die("Error. Unauthorized user.");  
    }
    

    现在,问题来了。为了让ajax请求发送cookie信息,我需要设置 withCredentials 选择 true

    但由于我的开发应用程序运行在4202上,Apache后端运行在443上,所以我还需要设置 header('Access-Control-Allow-Origin: *'); 在每个php文件中。这是不允许你做的事。我收到一个ajax错误: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'.

    我也试过在我的apache中设置这个 example.com 标题('Access-Control-Allow-Origin:*');

    SetEnvIf Origin ^(https?://.+\.example\.com(?::\d{1,5})?)$   CORS_ALLOW_ORIGIN=$1
    Header append Access-Control-Allow-Origin  %{CORS_ALLOW_ORIGIN}e   env=CORS_ALLOW_ORIGIN
    Header merge  Vary "Origin"
    

    但在本例中,ajax请求会报告一个错误:

    The value of the 'Access-Control-Allow-Credentials' header in the response is '' which must be 'true' when the request's credentials mode is 'include'.
    

    所以我的问题是,如果您需要使用cookies进行用户身份验证,并且您只想拥有一个版本的应用程序(包括angular和backend),您会怎么做?问题似乎是angular应用程序运行在4202上,并且被认为与运行在443上的后端不同。请注意,这个问题只在开发过程中出现,但我真的很犹豫是否在本地计算机上有一个版本,在服务器上有另一个版本。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Cobus Kruger    6 年前

    Access-Control-Allow-Origin ,除非您专门构建一个公共API。

    您所需要做的就是指定应该允许的确切地址。可以把它看作是后端服务器上所有允许访问的网站的白名单。在你的例子中,这是两个有角度的位置。

    所以将标题改为:

    header('Access-Control-Allow-Origin: https://app.example.com:4202,https://app2.example.com:4203');
    

    应该可以了。

    编辑

    事实证明,您还需要第二个头,以显式地允许凭据。

    header('Access-Control-Allow-Credentials: true');
    

    访问控制允许原点 当服务和客户机不在同一个服务器和主机上时,如果您想从浏览器调用web服务,那么就需要使用我之前介绍的源代码。