it-swarm.com.de

Domainübergreifende Cookies

Ich habe zwei WebApps WebApp1 und WebApp2 in zwei verschiedenen Domänen.

  1. Ich setze ein Cookie in WebApp1 in der HttpResponse.
  2. Wie lese ich den gleichen Cookie von HttpRequest in WebApp2?

Ich weiß, es klingt komisch, weil Cookies für eine bestimmte Domain spezifisch sind und wir nicht von verschiedenen Domains aus darauf zugreifen können. Ich habe jedoch von CROSS-DOMAIN-Cookies gehört, die von mehreren Webanwendungen verwendet werden können. Wie kann diese Anforderung mithilfe von CROSS-DOMAIN-Cookies implementiert werden?

Hinweis: Ich versuche dies mit J2EE-Webapps

207

Wie andere Leute sagen, können Sie keine Cookies freigeben, aber Sie könnten so etwas tun:

  1. zentralisieren Sie alle Cookies in einer Domain, sagen wir cookiemaker.com
  2. wenn der Benutzer eine Anfrage an example.com stellt, leiten Sie ihn an cookiemaker.com weiter
  3. cookiemaker.com leitet ihn mit den benötigten Informationen zurück zu example.com

Natürlich ist es nicht ganz sicher und Sie müssen eine Art internes Protokoll zwischen Ihren Apps erstellen, um dies zu tun.

Schließlich wäre es für den Benutzer sehr ärgerlich, wenn Sie bei jeder Anfrage so etwas tun, aber nicht, wenn es nur die erste ist.

Aber ich denke, es gibt keinen anderen Weg ...

117
alcuadrado

Ja, es ist absolut möglich, das Cookie von domain1.com über domain2.com abzurufen. Ich hatte das gleiche Problem mit einem Social Plugin meines sozialen Netzwerks und fand nach einem langen Recherchetag die Lösung.

Zunächst benötigen Sie auf der Serverseite die folgenden Header:

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, *");

Innerhalb der PHP-Datei können Sie $_COOKIE[name]

Zweitens auf der Client-Seite:

In Ihrer Ajax-Anfrage müssen Sie 2 Parameter angeben

crossDomain: true
xhrFields: { withCredentials: true }

Beispiel:

type: "get",
url: link,
crossDomain: true,
dataType: 'json',
xhrFields: {
  withCredentials: true
}
108
Ludovic

Soweit mir bekannt ist, unterliegen Cookies der "Same Origin" -Richtlinie. Mit CORS können Sie jedoch die Cookies "Server B" empfangen und verwenden, um eine dauerhafte Sitzung von "Server A" auf "Server B" einzurichten.

Dies erfordert jedoch einige Header auf "Server B":

Access-Control-Allow-Origin: http://server-a.domain.com
Access-Control-Allow-Credentials: true

Und Sie müssen das Flag " withCredentials " für alle "Server A" -Anfragen senden (Beispiel: xhr.withCredentials = true;)

Hier können Sie darüber lesen:

http://www.html5rocks.com/en/tutorials/cors/

https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS

65
Vitae Aliquam

Es gibt keine domänenübergreifenden Cookies. Sie könnten ein Cookie zwischen foo.example.com und bar.example.com aber niemals zwischen example.com und example2.com und das aus Sicherheitsgründen.

23
Darin Dimitrov

Mach was Google macht. Erstellen Sie eine PHP -Datei, in der das Cookie für alle drei Domänen festgelegt wird. Erstellen Sie dann in der Domäne, in der das Thema festgelegt werden soll, eine HTML-Datei, die die PHP -Datei lädt, mit der die Cookies für die beiden anderen Domänen festgelegt werden. Beispiel:

<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>

Fügen Sie dann einen Onload-Callback für das Body-Tag hinzu. Das Dokument wird nur geladen, wenn die Bilder vollständig geladen sind, dh wenn Cookies auf den anderen 2 Domains gesetzt sind. Onload-Rückruf:

<head>
   <script>
   function loadComplete(){
      window.location="http://domain1.com";//URL of domain1
   }
   </script>
</head>
<body onload="loadComplete()">

setcookie.php

Wir setzen die Cookies auf den anderen Domains mit einer PHP Datei wie folgt:

<?php
if(isset($_GET['theme'])){
   setcookie("theme", $_GET['theme'], time()+3600);
}
?>

Jetzt werden auf den drei Domains Cookies gesetzt.

11

Sie können Cookies nicht domänenübergreifend freigeben. Sie können jedoch allen Subdomains Zugriff gewähren. Um allen Subdomains von example.com Zugriff zu gewähren, setzen Sie die Domain auf .example.com.

Es ist jedoch nicht möglich, otherexample.com Zugriff auf die Cookies von example.com Zu gewähren.

10
Daniel Egeberg

Sie können versuchen, den Cookie-Wert mithilfe eines Image-Tags in eine andere Domain zu verschieben.

Ihr Kilometerstand kann variieren, wenn Sie versuchen, dies zu tun, da einige Browser erfordern, dass Sie eine ordnungsgemäße P3P-Richtlinie auf der WebApp2-Domäne haben, oder der Browser wird das Cookie ablehnen.

Wenn Sie sich die p3p-Richtlinie von plus.google.com ansehen, werden Sie feststellen, dass die Richtlinie wie folgt lautet:

CP = "Dies ist keine P3P-Richtlinie. Weitere Informationen finden Sie unter http://www.google.com/support/accounts/bin/answer.py?hl=de&answer=151657 ."

dies ist die Richtlinie, die sie für ihre + 1-Schaltflächen für diese domänenübergreifenden Anforderungen verwenden.

Eine weitere Warnung ist, dass Sie bei Verwendung von https sicherstellen müssen, dass das Image-Tag auf eine https-Adresse verweist, da sonst die Cookies nicht gesetzt werden.

7
Bryan Focht

Es gibt einen anständigen Überblick über wie Facebook es hier auf nfriedly.com macht

Es gibt auch Browser-Fingerabdrücke, die nicht mit Cookies identisch sind, aber einen ähnlichen Zweck erfüllen, indem sie Ihnen dabei helfen, einen Benutzer mit einem angemessenen Maß an Sicherheit zu identifizieren. Es gibt einen Post hier bei Stack Overflow , der auf eine Methode des Fingerabdrucks verweist

5
byZero

Die klügste Lösung ist, den Weg von Facebook zu beschreiten. Woher weiß Facebook, wer Sie sind, wenn Sie eine Domain besuchen? Es ist eigentlich sehr einfach :

Über die Schaltfläche "Gefällt mir" kann Facebook alle Besucher der externen Website verfolgen, unabhängig davon, ob sie darauf klicken oder nicht. Facebook kann das, weil es einen iframe verwendet, um den Button anzuzeigen. Ein iframe ist so etwas wie ein eingebettetes Browserfenster innerhalb einer Seite. Der Unterschied zwischen einem iframe und einem einfachen Bild für den Button besteht darin, dass der iframe eine komplette Webseite enthält - von Facebook. Auf dieser Seite ist nicht viel los, mit Ausnahme der Schaltfläche und der Information, wie vielen Personen die aktuelle Seite gefallen hat.

Wenn Sie also einen Like-Button auf cnn.com sehen, besuchen Sie gleichzeitig eine Facebook-Seite. Auf diese Weise kann Facebook einen Cookie auf Ihrem Computer lesen, den es erstellt hat, als Sie sich das letzte Mal bei Facebook angemeldet haben.

Eine grundlegende Sicherheitsregel in jedem Browser ist, dass nur die Website, die ein Cookie erstellt hat, es später lesen kann. Und das ist der Vorteil des iframe: Facebook kann Ihren Facebook-Cookie auch dann lesen, wenn Sie eine andere Website besuchen. So erkennen sie dich auf cnn.com und zeigen deine Freunde dort an.

Quelle:

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

Beziehen Sie UI Origin ein und setzen Sie Allow Crentials auf 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>
1
user7712621

Man kann unsichtbare Iframes verwenden, um die Cookies zu erhalten. Angenommen, es gibt zwei Domänen, a.com und b.com. Für die index.html der Domain a.com kann man hinzufügen (Bemerkung height = 0 width = 0):

<iframe height="0" id="iframe" src="http://b.com" width="0"></iframe>

Auf diese Weise erhält Ihre Website b.com-Cookies, sofern http://b.com die Cookies setzt.

Das nächste, was wäre, die Site innerhalb des Iframes durch JavaScript zu manipulieren. Die Operationen in iframe können zu einer Herausforderung werden, wenn man nicht die zweite Domain besitzt. Wenn Sie jedoch Zugriff auf beide Domains haben und auf die richtige Webseite bei iframe verweisen, sollten Sie die Cookies angeben, die Sie erhalten möchten.

0
Vadym Tyemirov