Table des matières
Contenu de la question
Solution
Enregistrez les cookies (l'API et le frontend sont sur le même hôte)
Envoyer des cookies
cors et cookies
Front-end
api
Maison développement back-end Golang Le navigateur n'enregistre pas les cookies envoyés par le backend Golang

Le navigateur n'enregistre pas les cookies envoyés par le backend Golang

Feb 14, 2024 pm 11:30 PM

Le navigateur nenregistre 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
}
Copier après la connexion

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;
}
Copier après la connexion

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
Copier après la connexion

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=nonesecure 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
}

Copier après la connexion

Je vous recommande également de lire la différence entre utiliser localstoragedocument.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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement? GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement? Mar 03, 2025 pm 05:17 PM

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

Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego? Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego? Mar 03, 2025 pm 05:22 PM

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

Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go? Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go? Mar 03, 2025 pm 05:18 PM

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

Comment écrire des objets et des talons simulés pour les tests en Go? Comment écrire des objets et des talons simulés pour les tests en Go? Mar 10, 2025 pm 05:38 PM

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

Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go? Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go? Mar 10, 2025 pm 03:20 PM

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

Comment écrire des fichiers dans GO Language de manière pratique? Comment écrire des fichiers dans GO Language de manière pratique? Mar 03, 2025 pm 05:15 PM

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.

Comment rédigez-vous des tests unitaires en Go? Comment rédigez-vous des tests unitaires en Go? Mar 21, 2025 pm 06:34 PM

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.

Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO? Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO? Mar 10, 2025 pm 05:36 PM

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

See all articles