web-dev-qa-db-fra.com

Cookie n'est pas défini sur angular Client

J'ai une application backend in Django python et il est servi sur http: // localhost: 8000.

J'ai un angular Frontend qui est servi sur http: // localhost: 4200.

J'ai handicapé Cors sur Django. En frappant l'API de connexion sur http: // localhost: 8000/auth/login /, je reçois une réponse valide avec l'en-tête Set-Cookie. enter image description here

Voici mon angular code pour imprimer les cookies:

  this.http.post<any>('http://localhost:8000/auth/login/', this.LoginForm, { observe: 'response' }).subscribe(response => {
   console.log("response is ", response);
   var cookies = this.cookieService.getAll();//('cookies');
   console.log("cookies is :", cookies);

Il imprime un objet vide sur la console. Comment faire ce travail? Je veux utiliser des cookies pour l'authentification.

7
noPE

Ensemble de cookies:

  • Client: client1.client.com
  • Server: Server1.Server.com

Une demande HTTP à partir de Angular dans client1.client.com à https://server1.server.com/api/v1/getsomething a Set-Cookie: JSESSIONID=xyz Dans l'en-tête de réponse. Le cookie sera mis sur server1.server.com et pas sur client1.client.com. Vous pouvez entrer server1.server.com Dans la barre d'URL et voir le cookie étant défini.

sans médrials:

Il n'y a pas besoin de l'application angular pour lire le cookie et l'envoyer dans les demandes suivantes. withCredentials La propriété de la demande HTTP peut être utilisée pour cela. Reportez-vous: - https://developer.mozilla.org/en-us/docs/web/api/xmlhttprequest/withpredentials =

Exemple:

public getSomething(): Observable<object> {
    const httpOptions = {
      withCredentials: true
    };
    return this.http.get(`${this.serverUrl}/getSomething`, httpOptions);
  }

Reportez-vous: https://angular.io/api/common/http/httpequest

withCredentials définira les cookies du domaine du serveur dans les demandes sur le serveur.

Comme mentionné précédemment Set-Cookie: JSESSIONID=xyz Dans la réponse de server1.server.com sera défini dans server1.server.com. The Angular App dans client1.client.com Need pas le lire. withCredentials prendra soin de cela.

problèmes de domaine croisés:

Dans mon examen récent du 20 mai 2020, j'ai constaté que Sans médrials ne fonctionne pas dans certains navigateurs lorsque le client et le serveur sont dans différents domaines.

enter image description here

Même domaine:

On dirait que les navigateurs traditionnels se déplacent pour bloquer les cookies tiers.

La solution consiste à avoir à la fois le client et le serveur dans le même domaine.

  • Client: client1.myapp.com
  • Serveur: server1.myapp.com

Et dans le Set-Cookie La réponse inclut le domaine racine aussi. Exemple: "Jsessionid = xyz; domaine = .myapp.com; chemin = /"

Cela garantira que les cookies sont définis dans tous les cas.

0
Newton Joshua