क्रॉस-डोमेन कुकीज़


247

मेरे पास दो अलग-अलग डोमेन में WebApp1 और WebApp2 हैं।

  1. मैं HttpResponse में WebApp1 में एक कुकी सेट कर रहा हूँ।
  2. WebApp2 में HttpRequest से एक ही कुकी कैसे पढ़ें?

मुझे पता है कि यह अजीब लगता है क्योंकि कुकीज़ किसी दिए गए डोमेन के लिए विशिष्ट हैं, और हम उन्हें विभिन्न डोमेन से एक्सेस नहीं कर सकते हैं; हालाँकि मैंने CROSS-DOMAIN कुकीज के बारे में सुना है, जिन्हें कई वेबपेजों पर साझा किया जा सकता है। CROSS-DOMAIN कुकीज़ का उपयोग करके इस आवश्यकता को कैसे लागू करें?

नोट: मैं इसे J2EE वेबैप्स के साथ आज़मा रहा हूँ

जवाबों:


130

हां, domain2.com से domain2.com से कुकी प्राप्त करना बिल्कुल संभव है। मुझे अपने सामाजिक नेटवर्क के सामाजिक प्लगइन के लिए एक ही समस्या थी, और एक दिन के शोध के बाद मुझे इसका समाधान मिला।

सबसे पहले, सर्वर की ओर आपको निम्नलिखित हेडर रखने की आवश्यकता है:

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

PHP-file के भीतर आप उपयोग कर सकते हैं $_COOKIE[name]

ग्राहक पक्ष पर दूसरा:

आपके ajax अनुरोध के भीतर आपको 2 पैरामीटर शामिल करने की आवश्यकता है

crossDomain: true
xhrFields: { withCredentials: true }

उदाहरण:

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

6
या यदि आप मूल को फ़िल्टर नहीं करना चाहते हैं, तो * के बजाय $ _SERVER ['HTTP_ORIGIN'] का उपयोग करें
Joel Teply

1
यह केवल एक चीज है जो मेरे लिए काम करती है। इसके अलावा, * मूल के रूप में स्वीकार नहीं किया गया था, इसलिए @ जोएल टेप्ली की टिप की आवश्यकता है।
अनुमान लगाया

4
यदि तृतीय-पक्ष कुकी अक्षम हैं (कुछ ब्राउज़र स्थितियों के लिए स्वचालित) तो यह काम नहीं करेगा। देखें blog.zok.pw/web/2015/10/21/3rd-party-cookies-in-practice और allannienhuis.com/archives/2013/11/03/... अधिक जानकारी के लिए।
रोबोकट

4
जोएल की नोक का उपयोग न करें, क्योंकि यह "संक्षेप में" समान है जो इसे "*" पर सेट करता है जो सूक्ष्म सुरक्षा छिद्रों को खोल सकता है इसलिए हतोत्साहित होता है, देखें stackoverflow.com/questions/12001269/…
rogerdpack

5
किस डोमेन के सर्वर साइड पर?
निक मैनिंग

127

जैसा कि अन्य लोग कहते हैं, आप कुकीज़ साझा नहीं कर सकते, लेकिन आप ऐसा कुछ कर सकते हैं:

  1. एक ही डोमेन में सभी कुकीज़ को केंद्रीकृत करें, चलिए बताते हैं cookiemaker.com
  2. जब उपयोगकर्ता example.com के लिए अनुरोध करता है तो आप उसे cookiemaker.com पर पुनर्निर्देशित करते हैं
  3. cookiemaker.com आपको आवश्यक जानकारी के साथ example.com पर वापस भेज देता है

बेशक, यह पूरी तरह से सुरक्षित नहीं है, और आपको ऐसा करने के लिए अपने ऐप्स के बीच किसी प्रकार का आंतरिक प्रोटोकॉल बनाना होगा।

अंत में, यह उपयोगकर्ता के लिए बहुत कष्टप्रद होगा यदि आप हर अनुरोध में ऐसा कुछ करते हैं, लेकिन ऐसा नहीं है यदि यह सिर्फ पहला है।

लेकिन मुझे लगता है कि कोई और रास्ता नहीं है ...


44
अगर कोई और रास्ता नहीं है, तो StackExchange / OpenID कैसे काम करता है?
Hawken

60
@Hawken StackExchange / OpenID ऊपर बताई गई उसी प्रक्रिया का अनुसरण करता है। आपको एक अलग साइट (एसओ> एसएक्स) के लिए निर्देशित किया जाता है, अपनी पहचान की पुष्टि करें, और फिर आपको आवश्यक जानकारी के साथ एसओ को वापस निर्देशित किया जाए। OpenID युक्ति अधिक व्याख्या करती है, हालांकि विकिपीडिया इसे अधिक स्पष्ट रूप से बताता है ।
निक क्यू।

1
सभी उपयोगकर्ता वास्तव में cookiemaker.com में लॉग इन हैं। और यह उपयोगकर्ता को एक विशेष और सुरक्षित संदेश के साथ विभिन्न साइटों पर पुनर्निर्देशित करता है जो सत्यापित करता है कि वे लॉग इन हैं और वे कौन हैं। इसे कैसे लागू किया जाए यह आपके ऊपर है, ऐसा करने के अनंत तरीके हैं। शायद आप इसका उपयोग कर सकते हैं: jwt.io
alcuadrado

8
@ एंड्रयू_1510 cookiebakerबेहतर होगा ;-)
रिचर्ड टर्नर

1
यहाँ छवि टैग के साथ पोस्ट है, यह एक बेहतर समाधान है ?
शैजुत

70

जहाँ तक मुझे पता है, कुकीज़ "उसी मूल" नीति द्वारा सीमित हैं। हालांकि, कॉर्स के साथ आप "सर्वर ए" से "सर्वर बी" पर लगातार सत्र स्थापित करने के लिए "सर्वर बी" कुकीज़ प्राप्त कर सकते हैं और उपयोग कर सकते हैं।

हालाँकि, इसके लिए "सर्वर B" पर कुछ शीर्षकों की आवश्यकता होती है:

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

और तुम झंडा "भेजने की आवश्यकता होगी withCredentials सभी" सर्वर ए 'अनुरोधों पर "(पूर्व: xhr.withCredentials = true;)

आप इसके बारे में यहां पढ़ सकते हैं:

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

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


11
यह अभ्यस्त कुछ उपयोगकर्ताओं के लिए काम करता है क्योंकि यदि तृतीय-पक्ष कुकीज़ अक्षम हैं जैसे कि डिफ़ॉल्ट रूप से सफारी जैसे मोज़िला सेटिंग्स तो कोर्स कुकीज़ काम नहीं करेंगी । Google अधिक उदाहरण और इस बारे में एक लेख कि फेसबुक तृतीय पक्ष कुकीज़ का उपयोग क्यों नहीं करता है।
रोबोकट

1
क्या स्टैक एक्सचेंज / ओपनआईडी कॉर्स का उपयोग करता है?
रायल्वेलिस

1
FWIW मैंने अभी एक सामान्य CORS withCredentials XHR का परीक्षण किया है और इसने FF / Safari / Chrome पर काम किया है ... हालाँकि मुझे संदेह नहीं है कि facebook / google अधिक परिष्कृत योजनाओं का उपयोग करता है
rogerdpack

30

क्रॉस डोमेन कुकी जैसी कोई चीज नहीं है। आप के बीच एक कुकी साझा कर सकता foo.example.comहै और bar.example.comलेकिन कभी के बीच example.comऔर example2.comऔर कहा कि सुरक्षा कारणों के लिए के।


1
हाय उत्तर के लिए धन्यवाद, क्या आप कृपया विन्यास भाग पर अधिक स्पष्टता जोड़ सकते हैं, कि कैसे / jeeeeeeeef में डोमेन और उप डोमेन को कॉन्फ़िगर / कॉन्फ़िगर करें ???
सुंदरजादेवलपर

1
यह एक ऐसा सवाल है जो serverfault.com के लिए अधिक अनुकूलित है, जहां आपको डोमेन के विशेषज्ञों से जवाब मिलेगा।
डारिन दिमित्रोव

नमस्ते, मैंने दो webapps होने की कोशिश की WebApp.domain.com ==> यहाँ मैं इस प्रकार से कुकी जोड़ रहा हूँ: कुकी कुकी = नया कुकी ("नामित", "परीक्षण"); cookie.setDomain ( "domain.com।"); response.addCookie (कुकी); WebApp1.domain.com ==> यहां मैंने निम्नानुसार कुकी को एक्सेस करने का प्रयास किया, लेकिन कुकी [] cks = request.getCookies () तक पहुंचने में सक्षम नहीं हो सका; for (int i = 0; i <cks.length; i ++) {out.print ("कुकी मिली" + cks [i] .getValue ()); } इस पर कोई विचार?
सुंदरराजडेवलपर्स

2
अक्सर दोहराया जाता है लेकिन यह सच नहीं है, नीचे मेरा जवाब देखें या यहां देखें stackoverflow.com/questions/16186645/…
राफेल जैगर

4
कैसे foo.example.comऔर के बीच कुकीज़ साझा करने के लिए कैसे bar.example.com?
जेफ तियान

24

इस पर फेसबुक के पथ का अनुसरण करने का सबसे चतुर समाधान है। जब आप किसी डोमेन पर जाते हैं तो फेसबुक कैसे जानता है कि आप कौन हैं? यह वास्तव में बहुत सरल है :

लाइक बटन वास्तव में फेसबुक को बाहरी साइट के सभी आगंतुकों को ट्रैक करने की अनुमति देता है, भले ही वे इसे क्लिक करें या नहीं। फेसबुक ऐसा कर सकता है क्योंकि वे बटन प्रदर्शित करने के लिए एक iframe का उपयोग करते हैं । एक iframe एक पृष्ठ के भीतर एम्बेडेड ब्राउज़र विंडो की तरह कुछ है। एक iframe और बटन के लिए एक साधारण छवि का उपयोग करने के बीच का अंतर यह है कि iframe में एक संपूर्ण वेब पेज है - फेसबुक से । इस पृष्ठ पर बहुत कुछ नहीं चल रहा है, केवल बटन को छोड़कर और वर्तमान पृष्ठ को कितने लोगों ने पसंद किया है, इसके बारे में जानकारी।

इसलिए जब आप cnn.com पर एक बटन की तरह देखते हैं, तो आप वास्तव में एक ही समय में एक फेसबुक पेज पर जा रहे हैं। यह फेसबुक को आपके कंप्यूटर पर एक कुकी पढ़ने की अनुमति देता है, जिसे उसने फेसबुक में लॉग इन करने का आखिरी समय बनाया है।

हर ब्राउज़र में एक मूलभूत सुरक्षा नियम यह है कि केवल एक वेबसाइट जिसने कुकी बनाई है, उसे बाद में पढ़ सकते हैं। और यह इफ्रेम का लाभ है: यह फेसबुक को आपके फेसबुक-कुकी को पढ़ने की अनुमति देता है, तब भी जब आप एक अलग वेबसाइट पर जा रहे हैं। यह है कि वे आपको cnn.com पर कैसे पहचानते हैं और अपने दोस्तों को वहां प्रदर्शित करते हैं।

स्रोत:


6
मुझे लगता है कि एक iframe शायद ही कभी कुछ करने के लिए सबसे अच्छे या सबसे अच्छे तरीके के रूप में वर्गीकृत करेगा .. लेकिन यह सबसे आसान है।
ओरुन

13

Google क्या कर रहा है। एक PHP फ़ाइल बनाएं जो सभी 3 डोमेन पर कुकी सेट करती है। फिर उस डोमेन पर जहां थीम सेट होने जा रही है, एक HTML फ़ाइल बनाएं जो अन्य 2 डोमेन पर कुकी सेट करने वाली PHP फ़ाइल को लोड करेगी। उदाहरण:

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

फिर बॉडी टैग पर एक ऑनलोड कॉलबैक जोड़ें। दस्तावेज़ केवल तभी लोड होगा जब छवियां पूरी तरह से लोड होती हैं जब कुकीज़ 2 अन्य डोमेन पर सेट होती हैं। ऑनलोड कॉलबैक:

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

setcookie.php

हम इस तरह एक PHP फ़ाइल का उपयोग कर अन्य डोमेन पर कुकीज़ सेट करें:

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

अब कुकीज को तीन डोमेन पर सेट किया गया है।


2
यह काम नहीं करता है यदि 'ब्लॉक थर्ड पार्टी कुकीज़' सुविधा सक्षम है।
जेन्स

11

आप डोमेन में कुकीज़ साझा नहीं कर सकते। हालाँकि आप सभी उप डोमेन को एक्सेस करने की अनुमति दे सकते हैं। सभी उप-डोमेन example.comको एक्सेस करने की अनुमति देने के लिए, डोमेन को सेट करें .example.com

हालांकि यह कुकीज़ otherexample.comतक पहुँच देना संभव नहीं है example.com


27
.google.comYouTube पर ब्राउज़ करते समय कुकीज़ कैसे दिखाई देती हैं?
हॉकेन

20
Google विश्लेषिकी टैग। वे कुकीज़ google.com से आती हैं, youtube.com से नहीं।
एन्टेंदु

8

आप एक छवि टैग का उपयोग करके कुकी घाटी को किसी अन्य डोमेन पर धकेलने का प्रयास कर सकते हैं।

ऐसा करने का प्रयास करते समय आपका माइलेज भिन्न हो सकता है क्योंकि कुछ ब्राउज़रों को आपको WebApp2 डोमेन पर एक उचित P3P नीति की आवश्यकता होती है या ब्राउज़र कुकी को अस्वीकार कर देगा।

यदि आप plus.google.com p3p नीति को देखते हैं, तो आप देखेंगे कि उनकी नीति है:

CP = "यह एक P3P नीति नहीं है! अधिक जानकारी के लिए http://www.google.com/support/accounts/bin/answer.py?hl=hi&answer=151657 देखें ।"

यही वह नीति है जो वे अपने +1 बटन के लिए इन क्रॉस डोमेन अनुरोधों का उपयोग करते हैं।

एक और चेतावनी यह है कि यदि आप https पर हैं, तो सुनिश्चित करें कि छवि टैग किसी https पते की ओर इशारा कर रहा है अन्यथा कुकीज़ सेट नहीं होंगी।


2
थोड़ा विस्तार करने के लिए देखभाल?
लगातार

5

Facebook का यह कैसे किया जाता है इसका एक अच्छा अवलोकन है nfriedly.com पर

इसमें ब्राउज़र फ़िंगरप्रिंटिंग भी है, जो कि कुकी के समान नहीं है, लेकिन इस तरह से एक उद्देश्य प्रदान करता है कि यह आपको एक उपयोगकर्ता को निश्चितता की उचित डिग्री की पहचान करने में मदद करता है। स्टैक ओवरफ्लो पर यहाँ एक पोस्ट है जो फ़िंगरप्रिंटिंग की एक विधि का संदर्भ देता है


1

एक कुकीज़ प्राप्त करने के लिए अदृश्य iframes का उपयोग कर सकते हैं। मान लीजिए कि दो डोमेन हैं, a.com और b.com। Domain.com के index.html के लिए कोई भी (नोटिस ऊंचाई = 0 चौड़ाई = 0) जोड़ सकता है:

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

इस तरह से आपकी वेबसाइट b.com कुकीज़ को मान लेगी कि http://b.com कुकीज़ सेट करता है।

अगली बात जावास्क्रिप्ट के माध्यम से iframe के अंदर साइट में हेरफेर होगी। Iframe के अंदर संचालन एक चुनौती बन सकता है अगर कोई दूसरा डोमेन का मालिक नहीं है। लेकिन iframe के src में सही वेब पेज का संदर्भ देने वाले दोनों डोमेन तक पहुंच होने की स्थिति में, कुकीज़ को वह स्थान देना चाहिए जो वह प्राप्त करना चाहता है।


5
बस एक चेतावनी: सफारी पर इफ्रेम्स में कुकीज़ के साथ कुछ गंभीर मुद्दे हैं। वे स्पष्ट रूप से क्रॉस डोमेन का काम नहीं करते हैं।
mvds

1
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

यूआई मूल को शामिल करें और क्रैडल को सच होने दें

<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

मैंने एक एनपीएम मॉड्यूल बनाया है, जो आपको डोमेन में स्थानीय रूप से संग्रहीत डेटा साझा करने की अनुमति देता है: https://www.npmjs.com/package/cookie-toss

डोमेन ए पर होस्ट किए गए एक iframe का उपयोग करके, आप अपने सभी उपयोगकर्ता डेटा को डोमेन A पर संग्रहीत कर सकते हैं, और उस डेटा को डोमेन A iframe में अनुरोध पोस्ट करके संदर्भित कर सकते हैं।

इस प्रकार, डोमेंस बी, सी, आदि वांछित डेटा को स्टोर और एक्सेस करने के लिए आईफ्रेम और पोस्ट अनुरोधों को इंजेक्ट कर सकते हैं। डोमेन ए सभी साझा किए गए डेटा का केंद्र बन जाता है।

डोमेन ए के अंदर एक डोमेन श्वेतसूची के साथ, आप केवल यह सुनिश्चित कर सकते हैं कि आपकी निर्भर साइटें डोमेन ए पर डेटा तक पहुंच सकें।

ट्रिक को डोमेन ए पर iframe के अंदर कोड रखना है जो यह पहचानने में सक्षम है कि कौन सा डेटा अनुरोध किया जा रहा है। उपरोक्त एनपीएम मॉड्यूल में README प्रक्रिया में गहराई से अधिक जाता है।

उम्मीद है की यह मदद करेगा!


-4

पढ़ें Cookie में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;
                            }
                        }
                    }

यह दो अलग-अलग डोमेन
निकल्स वुल्फ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.