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