web-dev-qa-db-fra.com

Obtenir et stocker un cookie (à partir de Set-Cookie) à partir d'une réponse AJAX POST

J'ai un simple jQuery AJAX POST code:

$.ajax({
    type: "POST",
    url: AppConstants.URLs.PROXY,
    data: message,
    xhrFields: {
        withCredentials: true
    },
    success: function(data, status, xhr) {
        console.log("Cookie: " + xhr.getResponseHeader("Set-Cookie"));
    }
});

et je souhaite obtenir le cookie et l'enregistrer en utilisant cookies-js .

Mais selon http://www.w3.org/TR/XMLHttpRequest/#the-getallresponseheaders%28%29-method :

  1. Renvoie tous les en-têtes de réponse, à l'exception des en-têtes qui ne respectent pas la casse pour Set-Cookie ou Set-Cookie2 , sous la forme d'une chaîne unique, avec chaque ligne d'en-tête séparés par une paire U + 000D CR U + 000A LF, à l'exclusion de la ligne d'état, et avec chaque nom et valeur d'en-tête séparés par une paire U + 003A COLON U + 0020 SPACE.

À l'aide de l'outil Réseau dans Chrome, "Set-Cookie" est visible dans les en-têtes de réponse. J'ai également vérifié que l'en-tête "Set-Cookie" apparaît en utilisant curl.

Que dois-je faire pour enregistrer le cookie dans mon application frontale? De plus, mon application fonctionne uniquement sur https .

Je serais ravi de fournir plus de détails sur demande.

9
ton

Vous ne pouvez pas obtenir les données des cookies dans votre JS. L'API ne vous permettra pas.

Que dois-je faire pour enregistrer le cookie dans mon application frontale?

Réglez simplement le Set-Cookie en-tête dans la réponse du code côté serveur. Le navigateur doit l'enregistrer automatiquement.

En tant que développeur, vous pourrez peut-être inspecter la valeur des cookies à l'aide des "Outils de développement".

Et le même cookie sera envoyé dans les demandes ultérieures au même domaine, jusqu'à ce que le cookie expire.

13
Quentin

Le navigateur ne peut pas donner accès à des cookies tiers comme ceux reçus de requêtes ajax pour des raisons de sécurité, cependant il s'en occupe automatiquement pour vous!

Pour que cela fonctionne, vous devez:

1) connectez-vous avec la demande ajax à partir de laquelle vous attendez le retour des cookies:

$.ajax("https://example.com/v2/login", {
     method: 'POST',
     data: {login_id: user, password: password},
     crossDomain: true,
     success: login_success,
     error: login_error
  });

2) Connectez-vous avec xhrFields: { withCredentials: true } dans les prochaines requêtes ajax pour utiliser les informations d'identification enregistrées par le navigateur

$.ajax("https://example.com/v2/whatever", {
     method: 'GET',
     xhrFields: { withCredentials: true },
     crossDomain: true,
     success: whatever_success,
     error: whatever_error
  });

Le navigateur s'occupe de ces cookies pour vous même s'ils ne sont pas lisibles depuis le headers ni le document.cookie

voir ma réponse ici: Comment obtenir un cookie à partir d'une réponse AJAX?

7
MrE