Akses Cookie melalui JSONP

Saya memiliki halaman di domain.com yang membuat permintaan ajax JSONP (menggunakan fungsi .getJSON() jQuery) ke URL di anotherdomain.com. Saya pikir (baca: berasumsi) bahwa sumber daya di anotherdomain.com akan memiliki akses sisi server ke cookie apa pun yang disetel di domain itu, tetapi sepertinya bukan itu masalahnya?

Panggilan ajax dilakukan secara khusus untuk mengakses cookie tertentu, melakukan manipulasi data, dan mengembalikan serangkaian informasi yang dikunci oleh nilai cookie. Domain asli tidak memiliki akses langsung ke nilai cookie, jadi menurut saya permintaan ajax akan mempertahankan status yang saya perlukan.

Informasi penting apa tentang cookie yang saya abaikan? Aku kelelahan dan aku tidak melihatnya.

Terima kasih.

PEMBARUAN

Saya menemukan cara untuk melakukannya, tetapi menurut saya sepertinya JSONP, jadi saya bertanya-tanya mengapa cara ini berhasil sedangkan versi Ajax tidak. Apakah permintaan tersebut baru saja terputus dari sesi browser sehingga tidak ada cookie yang dapat diakses?

<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 sumber
comment
Saya yakin Anda mungkin telah memeriksanya tiga kali lipat, tetapi seberapa yakin Anda bahwa cookie tersebut disetel oleh domain lain.com? Selain itu, bagaimana status cookie yang disetel, seperti kedaluwarsa, jalur, dll.   -  person Salman Paracha    schedule 22.11.2010
comment
Ya. Jika saya memperingatkan URL target sebelum panggilan ajax dan kemudian memuat URL target di tab baru, saya mendapatkan apa yang saya harapkan. Tampaknya panggilan Ajax lebih terputus dari sesi browser daripada yang saya kira.   -  person Rob Wilkerson    schedule 23.11.2010
comment
Coba panggilan $.ajax dengan tipe json dan lihat hasil seperti apa yang Anda dapatkan. BTW, pendekatan JSONP Anda telah didokumentasikan stackoverflow.com/questions/1421245/ dan berhasil untuk orang lain juga   -  person Salman Paracha    schedule 23.11.2010
comment
Terima kasih atas pembaruannya, Salman. Pertanyaan itu tidak pernah muncul dalam penelusuran saya, namun sepertinya persis yang saya coba lakukan. Saya tidak tahu mengapa itu tidak berhasil untuk saya. Panggilan JSON biasa tidak akan berfungsi karena ini merupakan permintaan lintas domain.   -  person Rob Wilkerson    schedule 23.11.2010
comment
Rob, bisakah kamu menjelaskan caramu melakukannya? Apakah itu mengacu pada cuplikan skrip di bagian bawah pertanyaan? Apakah menyematkan skrip dalam HTML sebenarnya berfungsi dibandingkan menggunakan panggilan jQuery $.getJSON? Kedua metode ini berfungsi ketika saya telah menerima cookie pihak ketiga yang dicentang di FF, tetapi tidak ada yang berfungsi jika tidak dicentang.   -  person andrewtweber    schedule 17.08.2011


Jawaban (2)


Kebijakan asal yang sama berlaku untuk semua permintaan ajax, jadi jika domain yang diakses dalam panggilan ajax adalah berbeda dengan domain yang dimuat di browser (document.host), semua cookie yang terkait dengan domain di url yang diminta tidak akan dikirim. Oleh karena itu, pendekatan JSONP berfungsi karena ia menulis tag skrip baru di jendela, yang akan berperilaku seperti permintaan sumber daya apa pun yang dapat dibuat oleh browser ke domain eksternal (sehingga meneruskan semua cookie yang terkait dengan domain tersebut di url). Saya juga telah mengonfirmasi hal ini hanya dengan memanggil $.post("http://atdmt.com") dari konsol chrome saya, saat berada di stackoverflow.com di browser (satu-satunya domain lain yang memiliki cookie di browser saya, saat menulis jawabannya) dan tidak mengirimkan cookie apa pun di header permintaan.

Solusi lain untuk mengatasi masalah pemeliharaan status domain lain.com adalah dengan membuat domain lain.com menyetel cookie pihak pertama (dengan tidak menyetel atribut domain cookie ) dan ketika permintaan ajax/json dibuat ke domain lain.com mengakses cookie tersebut melalui javascript dan meneruskan permintaan tersebut menggunakan parameter HTTP standar.

Semoga saya telah membantu.

person Salman Paracha    schedule 23.11.2010

Saya pernah mengalami masalah yang sama sebelumnya. Masalah yang saya temukan adalah sebagian besar browser tidak mengizinkan Anda MEMBANGUN sesi (yaitu menyetel cookie sesi) ketika kebijakan asal yang sama tidak dipenuhi.

person Joey Novak    schedule 22.03.2013