การเข้าถึงคุกกี้ผ่าน JSONP

ฉันมีเพจใน domain.com ที่สร้างคำขอ JSONP ajax (โดยใช้ฟังก์ชัน .getJSON() ของ jQuery) ไปยัง URL ใน anotherdomain.com ฉันคิดว่า (อ่าน: ถือว่า) ว่าทรัพยากรใน anotherdomain.com จะสามารถเข้าถึงคุกกี้ใด ๆ ที่ตั้งค่าในโดเมนนั้นทางฝั่งเซิร์ฟเวอร์ แต่ดูเหมือนจะไม่เป็นเช่นนั้น

การเรียก ajax กำลังดำเนินการเพื่อเข้าถึงคุกกี้เฉพาะโดยเฉพาะ ดำเนินการจัดการข้อมูล และส่งคืนชุดข้อมูลจำนวนมากที่ป้อนโดยค่าคุกกี้ โดเมนเดิมไม่สามารถเข้าถึงค่าคุกกี้ได้โดยตรง ดังนั้นฉันคิดว่าคำขอ ajax จะรักษาสถานะที่ฉันต้องการไว้

ข้อมูลสำคัญประการใดเกี่ยวกับคุกกี้ที่ฉันกำลังมองข้ามไป ฉันเหนื่อยและฉันแค่ไม่เห็นมัน

ขอบคุณ.

อัปเดต

ฉันพบวิธีที่จะทำมันแล้ว แต่ดูเหมือนว่า JSONP ในสายตาของฉัน ดังนั้นฉันจึงสงสัยว่าทำไมวิธีนี้ถึงได้ผลในขณะที่เวอร์ชัน Ajax ไม่ได้ผล คำขอถูกตัดการเชื่อมต่อจากเซสชันของเบราว์เซอร์จึงไม่สามารถเข้าถึงคุกกี้ได้หรือไม่

<script type="application/x-javascript" src="<?php echo $service_url . '&callback=interests' ?>"></script>
<script type="text/javascript">
  function interests( data ) {
    $( function() {
      var c_behaviors = data.length;
      var ids         = [];

      for( var i = 0; i < c_behaviors; i++ ) {
        ids.push( data[i].behavior_id );
      }

      $('body').append( '<p><label>Returned:</label> ' + ids.join( ', ' ) + '</p>' );       
    });
  }
</script>

person Rob Wilkerson    schedule 22.11.2010    source แหล่งที่มา
comment
ฉันแน่ใจว่าคุณอาจตรวจสอบสิ่งนี้แล้วสามเท่า แต่คุณแน่ใจได้อย่างไรว่าคุกกี้นั้นถูกตั้งค่าโดย anotherdomain.com นอกจากนี้ สถานะของคุกกี้ที่ถูกตั้งค่าเป็นอย่างไร เช่น การหมดอายุ เส้นทาง ฯลฯ   -  person Salman Paracha    schedule 22.11.2010
comment
ใช่. หากฉันแจ้งเตือน URL เป้าหมายก่อนการโทร ajax แล้วโหลด URL เป้าหมายในแท็บใหม่ ฉันจะได้สิ่งที่ฉันคาดหวังอย่างแน่นอน ดูเหมือนว่าการโทร Ajax จะถูกตัดการเชื่อมต่อจากเซสชันของเบราว์เซอร์มากกว่าที่ฉันคิด   -  person Rob Wilkerson    schedule 23.11.2010
comment
ลองโทร $.ajax ด้วยประเภท json แล้วดูว่าคุณได้รับผลลัพธ์ประเภทใด BTW วิธีการ JSONP ของคุณได้รับการบันทึกไว้ stackoverflow.com/questions/1421245/ และก็ใช้ได้กับคนอื่นเช่นกัน   -  person Salman Paracha    schedule 23.11.2010
comment
ขอบคุณสำหรับการอัปเดตซัลมาน คำถามนั้นไม่เคยเกิดขึ้นในการค้นหาของฉัน แต่ดูเหมือนว่าตรงกับสิ่งที่ฉันพยายามทำ ฉันไม่รู้ว่าทำไมมันไม่ทำงานสำหรับฉัน การเรียก JSON ปกติจะไม่ทำงานเนื่องจากเป็นคำขอข้ามโดเมน   -  person Rob Wilkerson    schedule 23.11.2010
comment
Rob คุณช่วยอธิบายหน่อยได้ไหมว่าวิธีการของคุณคืออะไร? นั่นหมายถึงตัวอย่างสคริปต์ที่ด้านล่างของคำถามใช่ไหม การฝังสคริปต์ในงาน HTML จริงซึ่งต่างจากการใช้การโทร jQuery $.getJSON หรือไม่ ทั้งสองวิธีทำงานเมื่อฉันยอมรับคุกกี้ของบุคคลที่สามที่ตรวจสอบใน FF แต่จะไม่ทำงานเมื่อไม่ได้เลือก   -  person andrewtweber    schedule 17.08.2011


คำตอบ (2)


นโยบายต้นทางเดียวกันนี้มีผลกับคำขอ ajax ทั้งหมด ดังนั้นหากโดเมนที่กำลังเข้าถึงในการเรียก ajax นั้น แตกต่างจากโดเมนที่โหลดในเบราว์เซอร์ (document.host) คุกกี้ทั้งหมดที่เชื่อมโยงกับโดเมนใน URL ที่ร้องขอจะไม่ถูกส่งไป ดังนั้น วิธี JSONP จึงใช้งานได้เนื่องจากจะเขียนแท็กสคริปต์ใหม่ในหน้าต่าง ซึ่งจะทำงานเหมือนกับคำขอทรัพยากรใดๆ ที่เบราว์เซอร์สามารถทำได้ไปยังโดเมนภายนอก (ด้วยเหตุนี้จึงส่งคุกกี้ทั้งหมดที่เกี่ยวข้องกับโดเมนใน URL) ฉันยังได้ยืนยันสิ่งนี้โดยเพียงแค่โทร $.post("http://atdmt.com") จากคอนโซล Chrome ของฉันในขณะที่อยู่ใน stackoverflow.com ในเบราว์เซอร์ (โดเมนอื่นเดียวที่มีคุกกี้ในเบราว์เซอร์ของฉันในขณะที่เขียนคำตอบ) และไม่ได้ส่งคุกกี้ใด ๆ ใน ขอส่วนหัว

วิธีแก้ปัญหาอื่นในการแก้ปัญหาการรักษาสถานะสำหรับ anotherdomain.com ก็คือให้ anotherdomain.com ตั้งค่าคุกกี้ของบุคคลที่หนึ่ง (โดยไม่ตั้งค่าแอตทริบิวต์โดเมนของคุกกี้ ) และเมื่อมีการส่งคำขอ ajax/json เพื่อ anotherdomain.com เข้าถึงคุกกี้เหล่านั้นผ่าน javascript และพุชคำขอโดยใช้พารามิเตอร์ HTTP มาตรฐาน

หวังว่าฉันได้ช่วย

person Salman Paracha    schedule 23.11.2010

ฉันเคยพบปัญหาเดียวกันมาก่อน ปัญหาที่ฉันพบคือเบราว์เซอร์ส่วนใหญ่จะไม่อนุญาตให้คุณสร้างเซสชัน (เช่น ตั้งค่าคุกกี้เซสชัน) เมื่อไม่เป็นไปตามนโยบายต้นทางเดียวกัน

person Joey Novak    schedule 22.03.2013