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
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/welcome向http://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)
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
您对正在发生的事情的描述似乎不正确。
这不是(或者至少不应该)正在发生的事情。当浏览器请求http://server.com/login并在响应中返回标头时,即使响应是重定向,Set-Cookiecookie 也会被设置并限制在该域中。server.com如果您看到发送到的“auth”cookie,client.com那么这是之前设置的 cookie client.com。
无论如何,看来你真正关心的是
发生这种情况的原因有很多。
server.com
Access-Control-Allow-Origin: http://client.comAccess-Control-Allow-Credentials: trueAccess-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 错误。
| 归档时间: |
|
| 查看次数: |
1095 次 |
| 最近记录: |