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.
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.
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.
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.
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.
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.
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.