8721 sujets

Développement web côté serveur, CMS

Salut !

J'ai besoin de votre aide pour un problème un peu relou que je maîtrise pas du tout.

Je dev une API avec Node / Koa, et j'ai une route POST de login que voici :

router.post('/api/user/login', async (ctx: Context): Promise<void> => await controller.connectUser(ctx));


La méthode connectUser() prend les données envoyées en POST (qui se trouvent dans ctx.request.body...), les compare aux infos de la BDD et si les infos entrées matchent un utilisateur, alors je sauvegarde ses infos (mail, token, pseudo etc) dans une session Koa comme ceci :

const auth: UserAuth = {
    // Données du User en question
};

ctx.session.auth = auth;


Donc jusque là tout va bien!

Le soucis, c'est que quand j'appel cette route depuis Postman, avec un bon mail et mot de passe, il sauvegarde bien les infos dans la session et me crée bien un cookie (puisqu'ensuite je peux faire mes appel sur d'autres routes et j'ai bien ma session) mais quand je le fais directement depuis notre app (Angular, en local pour le moment) il ne me sauvegarde pas la session et dans la console du navigateur je n'ai aucun cookie non plus...

Auriez vous une idée sur le pourquoi du comment ?

Merci Smiley biggrin
Modifié par Wazazaby (16 May 2020 - 00:43)
Si ça peut vous aider, j'ai aussi essayer de faire ça :

ctx.cookies.set('pseudo_user', 'Utilisateur1');

Pour juste écrire un cookie simple, et quand je fais
console.log(ctx.cookies);

ou
console.log(ctx.cookies.get('id'));


J'obtiens undefined

On dirait que mon app n'a pas le droit d’écrire un cookie ?
J'ai trouvé la réponse, je poste au cas où ça pourrait intéresser quelqu'un !

En premier j'ai crée des vraies règles pour nos CORS :

En "origin" faut mettre l'adresse de votre front (nous c'est front => http://localhost:4200, api => localhost:3000)

Le "credentials: true" est vraiment important => il permet de passer les cookies entre les 2

"methods" permet juste de définir les méthodes HTTP autorisées pour notre API, c'est pas nécessaire

app.use(cors({ 
    origin: 'http://localhost:4200',
    credentials: true,
    methods: ['GET', 'POST', 'DELETE', 'PUT', 'PATCH']
}));

Et ensuite dans notre appel à l'API depuis Angular :

return this.http.post<GlobalReturnInterface>(url, formData, { 
    withCredentials: true 
});


Ici dans le http.post, l'option "withCredentials: true" est aussi très importante, comme vu plus haut.

Voilà, j'espère que ça pourra aider quelqu'un un jour!
Modifié par Wazazaby (16 May 2020 - 00:42)
Meilleure solution