2012-01-27 20 views
5

Estoy trabajando en una extensión que analiza el feed rss de gmail para los usuarios. Permito que los usuarios especifiquen nombre de usuario/contraseñas si no desean permanecer conectados. Pero esto significa un inicio de sesión múltiple si el usuario está registrado y el nombre de usuario/contraseña proporcionado es para una cuenta diferente. Por lo tanto, quiero evitar el envío de cookies, pero aún así poder enviar el nombre de usuario/contraseña en la llamada a send().¿Hay alguna manera de no enviar cookies cuando se hace un XMLHttpRequest en el mismo origen?

Respuesta

3

Puede hacerlo utilizando el chrome.cookies module. La idea es conseguir que las galletas actuales, guardarlos, sacarlos de almacén de cookies del navegador, enviar su solicitud, y finalmente restaurarlos:

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 

Como alternativa, una solución más simple es abrir una ventana de incógnito que enviará la solicitud, usando el chrome.windows module, pero esto evitará que se comunique con el resto de su extensión. Tenga en cuenta que puede que tenga que cambiar la propiedad incognito de su manifiesta a split:

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

debería eliminar el 'cookie.hostOnly; y' 'eliminar cookie.session;' 'líneas sean realmente eliminar my_cookie_store [i] .hostOnly; 'y' eliminar my_cookie_store [i] .session; 'respectivamente? – Mala

4

A partir de Chrome 42, la fetch API permite extensiones de Chrome (y aplicaciones web en general) para realizar peticiones sin cookies. HTML5 Rocks offers an introductory tutorial on using the fetch API.

La documentación avanzada en fetch es bastante escasa en este momento, pero el API interface from the specification es un excelente punto de partida. El algoritmo de búsqueda descrito debajo de la interfaz muestra que las solicitudes generadas por fetch no tienen credenciales por defecto.

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 desea que las solicitudes verdaderamente anónimas, también se puede desactivar la caché:

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 
}); 
Cuestiones relacionadas