Cookie重定向后消失

Alo*_*lon 5 cookies redirect http node.js angular

我有:

1)具有自己域名的客户端应用程序:http://client.com

2)具有单独域的服务器端应用程序:http://server.com

现在,

场景是:

1)在浏览器中打开http://client.com/home,显示一个HTML页面.

2)http://client.com/home重定向到http://server.com/login

3)http://server.com/login存储cookie'auth'并向http://client.com/welcome发送重定向指令

响应:

Access-Control-Allow-Origin:*

连接:保持活力

内容长度:104

内容类型:text/html; 字符集= utf-8的

日期:2019年1月16日星期三格林威治标准时间10:47:11

地点:http://client.com/welcome

Set-Cookie:auth = 1479da80-197c-11e9-ba74-59606594e2fb; 路径= /

变化:接受

X-Powered-By:快递

4)浏览器收到响应,其中包含cookie'auth'

5)浏览器将自身重定向到http://client.com/welcome

6)'auth'cookie被发送到http://client.com/welcome

请求:

Cookie:auth = 1479da80-197c-11e9-ba74-59606594e2fb

7)http://client.com/welcome返回HTML但不返回cookie'autah'

在此输入图像描述

在此输入图像描述

8)http://client.com/welcomehttp://server.com/data(已启用CORS)发出AJAX请求,但未发送cookie"auth"

9)http://server.com/data无法识别用户,因为没有cookie

客户端是Node.js托管的角度应用程序

编辑:

正如所建议的那样,我已经添加到server.com的响应中:

Access-Control-Allow-Credentials:true

但没有任何改变.

相关客户端代码:

const headerOptions = new HttpHeaders({
      'Content-Type': 'application/json', 'withCredentials': 'true', 'Access-Control-Allow-Origin': 'true', 'Access-Control-Allow-Credentials': 'true'
    });

this.httpClient.get<any>(this.baseUrl + "data", { headers: headerOptions }).subscribe((res) => {
Run Code Online (Sandbox Code Playgroud)

Mav*_*tes 5

withCredentials在将 ajax 请求发送到http://server.com时,您应该使用该选项,并且您的 server.com 应该设置Access-Control-Allow-Credentials为 true。

Example code in Node.JS server:

var cors = require('cors');
var corsOptions = {
    origin: '*',
    credentials: true };

app.use(cors(corsOptions));
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请访问:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials

Example code in Angular.JS client
import {RequestOptions, Request, RequestMethod} from '@angular/http';

const options = new RequestOptions({
  method: RequestMethod.Post,
  url: 'https://google.com',
  withCredentials: true
});
Run Code Online (Sandbox Code Playgroud)

更多信息请参见: https: //angular.io/api/http/RequestOptions

另请查看: https: //github.com/angular/angular/issues/24283 - 看起来某个特定版本的 Angular 在该标志上存在问题,因此除非您使用的是更新的版本,您可能需要显式设置标头。

这样做的原因是,除非服务器明确告诉客户端“我将接受另一个域传递的 cookie(之前在我的域上设置)” - 接受 cookie 将是一个安全问题。更多信息请参见:https://en.wikipedia.org/wiki/Cross-site_request_forgery


Old*_*Pro 4

您对正在发生的事情的描述似乎不正确。

这不是(或者至少不应该)正在发生的事情。当浏览器请求http://server.com/login并在响应中返回标头时,即使响应是重定向,Set-Cookiecookie 也会被设置并限制在该域中。server.com如果您看到发送到的“auth”cookie,client.com那么这是之前设置的 cookie client.com

无论如何,看来你真正关心的是

发生这种情况的原因有很多。

  • 跨域资源共享。您提到它已启用 CORS,但为了其他人阅读本文,您必须设置以下 CORS 标头server.com
    • Access-Control-Allow-Origin: http://client.com
    • Access-Control-Allow-Credentials: true
  • Access-Control-Allow-Origin请注意,在发送凭据时无法避免使用通配符。另请注意,来源必须完全匹配,包括方案(http 或 https)。在实践中,服务器通常做的是读取Origin请求的标头,根据白名单进行检查,如果允许,则将Origin标头值从请求复制到Access-Control-Allow-Origin响应中的标头。
  • 您必须xhr.withCredentials = true在 XHR 请求中进行设置。(看有关更多详细信息,请参阅MDN 。)

当你完成所有这些之后,你的道路上又出现了另一个障碍。因为你在client.com尝试向 发送 cookie server.com,所以该server.comcookie 被视为“第三方”cookie。据我所知,所有主要浏览器都有一个设置来阻止第三方 cookie 以保护隐私,因为跟踪器最常使用它们来收集广告营销数据。我相信他们中的大多数人默认都会阻止第三方 cookie,但我对此并不确定。当然,很多人都将浏览器设置为阻止第三方 cookie。

因此,您必须告诉访问者将其浏览器配置为允许第三方 cookieserver.com

顺便说一句,在重定向到不同域时设置 cookie 并不安全。虽然据我所知,这是允许的,但浏览器支持存在问题。例如,请参阅此Chrome 错误