


Le navigateur n'enregistre pas les cookies envoyés par le backend Golang
l'éditeur php Strawberry est là pour vous présenter un problème concernant l'enregistrement des cookies par les navigateurs. Parfois, lorsque nous utilisons le backend Golang pour envoyer des cookies, nous constatons que le navigateur ne les enregistre pas. Cela peut être dû à un certain nombre de raisons, telles que les paramètres de confidentialité du navigateur ou certains problèmes dans le code. Dans cet article, nous explorerons ce problème en détail et proposerons quelques solutions pour garantir que les navigateurs enregistrent correctement les cookies envoyés par le backend Golang. commençons!
Contenu de la question
Je sais que cette question a été posée plusieurs fois, mais j'ai essayé la plupart des réponses et je n'arrive toujours pas à la faire fonctionner.
J'ai une API Golang avec un package net/http et une interface js. J'ai une fonction
func setcookie(w *http.responsewriter, email string) string { val := uuid.newstring() http.setcookie(*w, &http.cookie{ name: "gocookie", value: val, path: "/", }) return val }
Cette fonction est appelée lorsque l'utilisateur se connecte et je souhaite qu'elle soit envoyée à tous les autres points de terminaison. Cela correspond aux attentes du facteur. Cependant, en ce qui concerne le navigateur, je n'arrive pas à lui faire mémoriser le cookie ou même à l'envoyer à d'autres points de terminaison.
exemple js utilisant un point de terminaison
async function getDataWithQuery(query, schema){ let raw = `{"query":"${query}", "schema":"${schema}"}`; let requestOptions = { method: 'POST', body: raw, redirect: 'follow', }; try{ let dataJson = await fetch("http://localhost:8080/query/", requestOptions) data = await dataJson.json(); }catch(error){ console.log(error); } return data; }
J'ai essayé de configurer samesite
属性,或在 js 中使用 credential: "include"
dans Golang et d'autres réponses, mais sans succès.
Solution
Grâce à la discussion dans les commentaires, j'ai trouvé quelques astuces sur ce problème.
Enregistrez les cookies (l'API et le frontend sont sur le même hôte)
J'utilise document.cookie
来保存cookie。我手动设置选项,因为在 api fetch
的响应上调用 res.cookie
仅返回值。一个例子是 document.cookie = `gocookie=${res.cookie};路径=/;域=localhost;
.
Envoyer des cookies
Cette question a reçu une réponse dans une question précédente et encore dans les commentaires. Le problème est que j'ai utilisé credential:'include'
而不是正确的 credentials:'include'
(pluriel).
cors et cookies
Si l'API et le frontend ne sont pas sur le même hôte, vous devrez modifier à la fois l'API et le frontend.
Front-end
Le cookie doit avoir le domaine de l'API, puisque c'est l'API qui en a besoin, pas le frontend. Ainsi, pour des raisons de sécurité, vous ne pouvez pas définir de cookies pour un domaine (api) d'un autre domaine (frontend). La solution consiste à rediriger l'utilisateur vers un point de terminaison d'API qui renvoie un en-tête set-cookie
dans les en-têtes de réponse. Cette solution demande au navigateur d'enregistrer le cookie avec un domaine supplémentaire (le domaine de l'API, puisque l'API l'a envoyé).
De plus, vous devez toujours inclure credentials:'include'
sur le frontend.
api
Vous devez définir des en-têtes. Ce que j'ai défini, c'est
w.header().set("access-control-allow-origin", frontendorigin) w.header().set("access-control-allow-credentials", "true") w.header().set("access-control-allow-headers", "content-type, withcredentials") w.header().set("access-control-allow-methods", method) // use the endpoint's method: post, get, options
Vous devez exposer le point de terminaison où le frontend redirigera l'utilisateur et définir un cookie dans la réponse. Vous pouvez l'omettre et au lieu de définir manuellement le domaine de l'API, le navigateur le remplira automatiquement avec le domaine.
Pour gérer les cors et que js envoie le cookie avec succès, vous devez définir l'attribut samesite=none
和 secure
dans le cookie et servir l'API via https (pour plus de simplicité, j'ai utilisé ngrok).
Comme ça
func SetCookie(w *http.ResponseWriter, email string) string { val := uuid.NewString() http.SetCookie(*w, &http.Cookie{ Name: "goCookie", Value: val, SameSite: http.SameSiteNoneMode, Secure: true, Path: "/", }) // rest of the code }
Je vous recommande également de lire la différence entre utiliser localstorage
和 document.cookie
, c'est l'un des problèmes que j'ai rencontré.
J'espère que cela vous aidera.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Cet article explique les mécanismes d'importation des packages de Go: les importations nommées (par exemple, importation & quot; fmt & quot;) et les importations vierges (par exemple, importation _ & quot; fmt & quot;). Les importations nommées rendent le contenu du package accessible, tandis que les importations vierges ne font que l'exécuter t

Cet article explique la fonction Newflash () de Beego pour le transfert de données inter-pages dans les applications Web. Il se concentre sur l'utilisation de NewFlash () pour afficher les messages temporaires (succès, erreur, avertissement) entre les contrôleurs, en tirant parti du mécanisme de session. Limiter

Cet article détaille la conversion efficace de la requête MySQL Resulte en tranches de structure GO. Il met l'accent sur l'utilisation de la méthode de numérisation de la base de données / SQL pour des performances optimales, en évitant l'analyse manuelle. Meilleures pratiques pour la cartographie des champs struct à l'aide de balises DB et de robus

Cet article montre la création de simulations et de talons dans GO pour les tests unitaires. Il met l'accent sur l'utilisation des interfaces, fournit des exemples d'implémentations simulées et discute des meilleures pratiques telles que la tenue de simulations concentrées et l'utilisation de bibliothèques d'assertion. L'articl

Cet article explore les contraintes de type personnalisé de Go pour les génériques. Il détaille comment les interfaces définissent les exigences de type minimum pour les fonctions génériques, améliorant la sécurité du type et la réutilisabilité du code. L'article discute également des limitations et des meilleures pratiques

Cet article détaille la rédaction de fichiers efficace dans GO, en comparant OS.WriteFile (adapté aux petits fichiers) avec OS.OpenFile et Buffered Writes (optimal pour les fichiers volumineux). Il met l'accent sur la gestion robuste des erreurs, l'utilisation de différer et la vérification des erreurs spécifiques.

L'article traite des tests d'unité d'écriture dans GO, couvrant les meilleures pratiques, des techniques de moquerie et des outils pour une gestion efficace des tests.

Cet article explore l'utilisation d'outils de traçage pour analyser le flux d'exécution des applications GO. Il traite des techniques d'instrumentation manuelles et automatiques, de comparaison d'outils comme Jaeger, Zipkin et OpenTelelemetry, et mettant en évidence une visualisation efficace des données
