web-applications - tag - que es conversion adwords
Cookies de dominio cruzado (11)
Como dicen otras personas, no puedes compartir cookies, pero podrías hacer algo como esto:
- centralice todas las cookies en un solo dominio, digamos cookiemaker.com
- cuando el usuario realiza una solicitud a example.com lo redirecciona a cookiemaker.com
- cookiemaker.com lo redirige a example.com con la información que necesita
Por supuesto, no es completamente seguro, y tienes que crear algún tipo de protocolo interno entre tus aplicaciones para hacer eso.
Por último, sería muy molesto para el usuario si hace algo así en cada solicitud, pero no si es solo el primero.
Pero creo que no hay otra manera ...
Tengo dos webapps WebApp1 y WebApp2 en dos dominios diferentes.
- Estoy configurando una cookie en WebApp1 en HttpResponse.
- ¿Cómo leer la misma cookie de HttpRequest en WebApp2?
Sé que suena raro porque las cookies son específicas de un dominio dado, y no podemos acceder a ellas desde dominios diferentes; Sin embargo, he oído hablar de las cookies CROSS-DOMAIN que se pueden compartir en varias aplicaciones web. ¿Cómo implementar este requisito usando las cookies CROSS-DOMAIN?
Nota: Estoy intentando esto con webapps J2EE
Hasta donde yo sé, las cookies están limitadas por la política de "mismo origen". Sin embargo, con CORS puede recibir y usar las cookies del "Servidor B" para establecer una sesión persistente desde el "Servidor A" en el "Servidor B".
Aunque, esto requiere algunos encabezados en "Servidor B":
Access-Control-Allow-Origin: http://server-a.domain.com
Access-Control-Allow-Credentials: true
Y deberá enviar la marca " withCredentials " en todas las solicitudes de "Server A" (por ejemplo: xhr.withCredentials = true;
)
Usted puede leer sobre ello aquí:
http://www.html5rocks.com/en/tutorials/cors/
https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS
Hay una descripción decente de cómo Facebook lo hace aquí en nfriedly.com
También hay huellas dactilares en el navegador, que no es lo mismo que una cookie, pero tiene un propósito similar ya que lo ayuda a identificar a un usuario con un cierto grado de certeza. Hay una publicación aquí en que hace referencia a un método de huella digital
Haz lo que Google está haciendo. Crea un archivo PHP que establezca la cookie en los 3 dominios. Luego, en el dominio donde se va a establecer el tema, cree un archivo HTML que cargue el archivo PHP que establece cookies en los otros 2 dominios. Ejemplo:
<html>
<head></head>
<body>
<p>Please wait.....</p>
<img src="http://domain2.com/setcookie.php?theme=whateveryourthemehere" />
<img src="http://domain3.com/setcookie.php?theme=whateveryourthemehere" />
</body>
</html>
A continuación, agregue una devolución de llamada de onload en la etiqueta del cuerpo. El documento solo se cargará cuando las imágenes se carguen por completo, es decir, cuando las cookies se establezcan en los otros 2 dominios. Retrollamada Onload:
<head>
<script>
function loadComplete(){
window.location="http://domain1.com";//URL of domain1
}
</script>
</head>
<body onload="loadComplete()">
setcookie.php
Configuramos las cookies en los otros dominios usando un archivo PHP como este:
<?php
if(isset($_GET[''theme''])){
setcookie("theme", $_GET[''theme''], time()+3600);
}
?>
Ahora las cookies se establecen en los tres dominios.
Leer Cookie
en la Web Api
var cookie = actionContext.Request.Headers.GetCookies("newhbsslv1");
Logger.Log("Cookie " + cookie, LoggerLevel.Info);
Logger.Log("Cookie count " + cookie.Count, LoggerLevel.Info);
if (cookie != null && cookie.Count > 0)
{
Logger.Log("Befor For " , LoggerLevel.Info);
foreach (var perCookie in cookie[0].Cookies)
{
Logger.Log("perCookie " + perCookie, LoggerLevel.Info);
if (perCookie.Name == "newhbsslv1")
{
strToken = perCookie.Value;
}
}
}
No hay cookies de dominio cruzado. Puede compartir una cookie entre foo.example.com
y bar.example.com
pero nunca entre example.com
y example2.com
y eso por razones de seguridad.
No puede compartir cookies entre dominios. Sin embargo, puede permitir que todos los subdominios tengan acceso. Para permitir que todos los subdominios de example.com
tengan acceso, configure el dominio en .example.com
.
Sin otherexample.com
, no es posible dar acceso a otherexample.com
a las cookies de example.com
.
Puede intentar enviar el cookie val a otro dominio con una etiqueta de imagen.
Su kilometraje puede variar al intentar hacer esto porque algunos buscadores requieren que tenga una Política P3P adecuada en el dominio WebApp2 o el navegador rechazará la cookie.
Si consulta la política plus.google.com p3p, verá que su política es:
CP = "Esta no es una política de P3P. Consulte http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 para obtener más información".
esa es la política que usan para sus botones +1 a estas solicitudes de dominios cruzados.
Otra advertencia es que si está en https, asegúrese de que la etiqueta de la imagen apunte a una dirección https; de lo contrario, las cookies no se configurarán.
Sí, es absolutamente posible obtener la cookie de domain1.com por domain2.com. Tuve el mismo problema para un complemento social de mi red social, y después de un día de investigación encontré la solución.
Primero, en el lado del servidor debe tener los siguientes encabezados:
header("Access-Control-Allow-Origin: http://origin.domain:port");
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Methods: GET, POST");
header("Access-Control-Allow-Headers: Content-Type, *");
Dentro del archivo PHP puedes usar $_COOKIE[name]
Segundo, en el lado del cliente:
Dentro de su solicitud de AJAX debe incluir 2 parámetros
crossDomain: true
xhrFields: { withCredentials: true }
Ejemplo:
type: "get",
url: link,
crossDomain: true,
dataType: ''json'',
xhrFields: {
withCredentials: true
}
Uno puede usar iframes invisibles para obtener las cookies. Digamos que hay dos dominios, a.com y b.com. Para el index.html del dominio a.com uno puede agregar (altura de aviso = 0 ancho = 0):
<iframe height="0" id="iframe" src="http://b.com" width="0"></iframe>
De esta forma, su sitio web recibirá las cookies de b.com suponiendo que http://b.com establece las cookies.
Lo siguiente sería manipular el sitio dentro del iframe a través de JavaScript. Las operaciones dentro de iframe pueden convertirse en un desafío si uno no posee el segundo dominio. Pero en caso de tener acceso a ambos dominios, la página web correcta en el src de iframe debe proporcionar las cookies que uno desea obtener.
function GetOrder(status, filter) {
var isValid = true; //isValidGuid(customerId);
if (isValid) {
var refundhtmlstr = '''';
//varsURL = ApiPath + ''/api/Orders/Customer/'' + customerId + ''?status='' + status + ''&filter='' + filter;
varsURL = ApiPath + ''/api/Orders/Customer?status='' + status + ''&filter='' + filter;
$.ajax({
type: "GET",
//url: ApiPath + ''/api/Orders/Customer/'' + customerId + ''?status='' + status + ''&filter='' + filter,
url: ApiPath + ''/api/Orders/Customer?status='' + status + ''&filter='' + filter,
dataType: "json",
crossDomain: true,
xhrFields: {
withCredentials: true
},
success: function (data) {
var htmlStr = '''';
if (data == null || data.Count === 0) {
htmlStr = ''<div class="card"><div class="card-header">Bu kriterlere uygun sipariş bulunamadı.</div></div>'';
}
else {
$(''#ReturnPolicyBtnUrl'').attr(''href'', data.ReturnPolicyBtnUrl);
var groupedData = data.OrderDto.sort(function (x, y) {
return new Date(y.OrderDate) - new Date(x.OrderDate);
});
groupedData = _.groupBy(data.OrderDto, function (d) { return toMonthStr(d.OrderDate) });
localStorage[''orderData''] = JSON.stringify(data.OrderDto);
$.each(groupedData, function (key, val) {
var sortedData = groupedData[key].sort(function (x, y) {
return new Date(y.OrderDate) - new Date(x.OrderDate);
});
htmlStr += ''<div class="card-header">'' + key + ''</div>'';
$.each(sortedData, function (keyitem, valitem) {
//Date Convertions
if (valitem.StatusDesc != null) {
valitem.StatusDesc = valitem.StatusDesc;
}
var date = valitem.OrderDate;
date = date.substring(0, 10).split(''-'');
date = date[2] + ''.'' + date[1] + ''.'' + date[0];
htmlStr += ''<div class="col-lg-12 col-md-12 col-xs-12 col-sm-12 card-item clearfix ">'' +
//''<div class="card-item-head"><span class="order-head">Sipariş No: <a href="ViewOrderDetails.html?CustomerId='' + customerId + ''&OrderNo='' + valitem.OrderNumber + ''" >'' + valitem.OrderNumber + ''</a></span><span class="order-date">'' + date + ''</span></div>'' +
''<div class="card-item-head"><span class="order-head">Sipariş No: <a href="ViewOrderDetails.html?OrderNo='' + valitem.OrderNumber + ''" >'' + valitem.OrderNumber + ''</a></span><span class="order-date">'' + date + ''</span></div>'' +
''<div class="card-item-head-desc">'' + valitem.StatusDesc + ''</div>'' +
''<div class="card-item-body">'' +
''<div class="slider responsive">'';
var i = 0;
$.each(valitem.ItemList, function (keylineitem, vallineitem) {
var imageUrl = vallineitem.ProductImageUrl.replace(''{size}'', 200);
htmlStr += ''<div><img src="'' + imageUrl + ''" alt="'' + vallineitem.ProductName + ''"><span class="img-desc">'' + ProductNameStr(vallineitem.ProductName) + ''</span></div>'';
i++;
});
htmlStr += ''</div>'' +
''</div>'' +
''</div>'';
});
});
$.each(data.OrderDto, function (key, value) {
if (value.IsSAPMigrationflag === true) {
refundhtmlstr = ''<div class="notify-reason"><span class="note"><B>Notification : </B> Geçmiş siparişleriniz yükleniyor. Lütfen kısa bir süre sonra tekrar kontrol ediniz. Teşekkürler. </span></div>'';
}
});
}
$(''#orders'').html(htmlStr);
$("#notification").html(refundhtmlstr);
ApplySlide();
},
error: function () {
console.log("System Failure");
}
});
}
}
Web.config
Incluya el origen de la interfaz de usuario y establezca Allow Crentials en true
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="http://burada.com" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
<add name="Access-Control-Allow-Credentials" value="true" />
</customHeaders>
</httpProtocol>