Existe-t-il un moyen de ne pas envoyer de cookies lors de la rédaction d'un XMLHttpRequest sur la même origine?

Je travaille sur une extension qui analyse le flux rss de gmail pour les utilisateurs. J'autorise les utilisateurs à spécifier le nom d'utilisateur / les mots de passe s'ils ne veulent pas rester connectés. Mais cela casse pour la connexion multiple si l'utilisateur est connecté et que le nom d'utilisateur / mot de passe fourni est pour un compte différent. Je souhaite donc éviter d'envoyer des cookies, mais je peux toujours envoyer le nom d'utilisateur / mot de passe dans l'appel send ().

À partir de Chrome 42, l' API fetch permet aux extensions Chrome (et aux applications Web en général) d'effectuer des requêtes sans cookies. HTML5 Rocks offre un tutoriel d'introduction à l'utilisation de l'API fetch .

La documentation avancée sur l' fetch est assez rare pour le moment, mais l' interface API de la spécification est un excellent point de départ. L'algorithme de récupération décrit ci-dessous l'interface montre que les requêtes générées par fetch n'ont pas d'informations d'identification par défaut.

 fetch('http://example.com/').then(function(response) { return response.text(); // <-- Promise<String> }).then(function(responseText) { alert('Response body without cookies:\n' + responseText); }).catch(function(error) { alert('Unexpected error: ' + error); }); 

Si vous voulez des demandes vraiment anonymes, vous pouvez également désactiver le cache:

 fetch('http://example.com/', { // credentials: 'omit', // this is the default value cache: 'no-store', }).then(function(response) { // TODO: Handle the response. // https://fetch.spec.whatwg.org/#response-class // https://fetch.spec.whatwg.org/#body }); 

Vous pouvez le faire en utilisant le module chrome.cookies . L'idée est d'obtenir les cookies actuels, de les sauvegarder, de les supprimer du magasin de cookies du navigateur, d'envoyer votre demande et enfin de les restaurer:

 var cookies_temp = []; // where you put the cookies first var my_cookie_store = []; // the cookies will be there during the request var details = {/*your code*/}; // the first parameter for chrome.cookies.getAll() var start_kidnapping = function(cookies) { cookies_temp = cookies.slice(); kidnap_cookie(); }; var kidnap_cookie = function() { // This recursive function will store the cookies from cookies_temp to // my_cookie_store and then remove them from the browser's cookie store. if (cookies_temp.length == 0) { // when no more cookies, end recursion send_request(); }; else { var cookie = cookies_temp.pop(); // We store url as a property since it is useful later. // You may want to change the scheme. cookie.url = "http://" + cookie.domain + cookie.path; my_cookie_store.push(cookie); // save it chrome.cookies.remove({url: cookie.url, name: cookie.name}, kidnap_cookie); }; }; var send_request = function() { // Send your request here. It can be asynchronous. for (var i = 0, i < my_cookie_store.length; i++){ delete cookie.hostOnly; // these 2 properties are not part of the delete cookie.session; // object required by chrome.cookies.set() // note that at this point, cookie is no longer a Cookie object chrome.cookies.set(my_cookie_store[i]); // restore cookie }; my_cookie_store = []; // empty it for new adventures }; chrome.cookies.getAll(details, start_kidnapping); // start 

Alternativement, une solution plus simple est d'ouvrir une fenêtre incognito qui enverra la demande, en utilisant le module chrome.windows , mais cela vous empêchera de communiquer avec le reste de votre extension. Notez que vous devrez modifier la propriété incognito de votre manifeste pour se split :

 var incognito_window = { "url": "incognito.html", "focused": false, // do not bother user "incognito": true } chrome.windows.create(incognito_window);