2017-09-29 12 views
0

J'ai une application de serveur assez simple écrit en aller:Impossible d'obtenir les cookies du côté serveur (golang) dans une réaction application (CORS)

package main 

import (
    "fmt" 
    "math/rand" 
    "time" 
    "net/http" 
    "encoding/base64" 
    "encoding/json" 
    "github.com/rs/cors" 
) 

type Message struct { 
    Text string `json:"text"` 
} 

var cookieQuotes = []string{ 
    ... 
} 

const COOKIE_NAME = "your_cookie" 

func main() { 
    mux := http.NewServeMux() 
    mux.HandleFunc("/set_cookie", setCookie) 
    mux.HandleFunc("/get_cookie", getCookie) 
    mux.Handle("/favicon.ico", http.NotFoundHandler()) 
    handler := cors.Default().Handler(mux) 
    http.ListenAndServe(":8080", handler) 
} 

... 

Eh bien, je l'ai sauté le plus de code ici, mais laissez-moi vous expliquer ce qu'il fait. Lorsque nous passons au chemin/set_cookie, nous recevons un cookie dans notre navigateur. Cookie a une valeur, qui est un texte chiffré de citation sur un cookie. Donc, voici la fonction:

func setCookie(w http.ResponseWriter, r *http.Request) { 
    quote := getRandomCookieQuote() 
    encQuote := base64.StdEncoding.EncodeToString([]byte(quote)) 
    http.SetCookie(w, &http.Cookie{ 
     Name: COOKIE_NAME, 
     Value: encQuote, 
    }) 
} 

Cette application est déployée dans VirtualBox dans un conteneur docker.

Alors, quand j'accéder à la

http://IP_ADDRESS:PORT/set_cookie

le cookie est réglé sur le navigateur. Et quand j'accéder à

http://IP_ADDRESS:PORT/get_cookie

je reçois le texte déchiffré à partir d'un cookie (mais cela n'a pas d'importance dans le cas de cette question)

Le côté client est écrit dans React. Eh bien, je pense qu'il est pas nécessaire d'afficher tout le code de l'application, mais la partie principale est ici:

export const setCookie =() => async dispatch => { 
    const res = await axios.get(URL+SET_COOKIE_PATH); 
    console.log('set_cookie', res); 
}; 

Il est la même chose que si nous venons d'appeler

http://IP_ADDRESS:PORT/set_cookie

Mais je ne peux pas obtenir le cookie au navigateur. Jamais. Je reçois la réponse avec le code de statut 200 et tout semble aller bien, mais je n'ai pas de cookie.

Je dois mentionner que c'est une question de site croisé. Donc, la question est: Comment est-ce que je pourrais passer le cookie du serveur au client?

+1

Vous "passer cookies du serveur au client" via un en-tête Set-Cookie (construit par 'http.SetCookie'). Cela semble bien. Notez que le navigateur n'a pas besoin d'accepter le cookie.Certains de ces rejets sont contrôlés par des paramètres utilisateur tels que le rejet de cookies tiers (que tout le monde devrait rejeter). Si votre requête déclenchée par React n'est pas considérée comme une demande d'origine, le navigateur peut rejeter le cookie reçu en tant que tiers. Vous ne devriez pas compter sur la possibilité de définir (ou même de lire) des cookies sur plusieurs sites. – Volker

+0

Mais est-ce possible de faire une application non-cross-site avec le serveur golang et le client de réaction? Et si non, quelles sont les alternatives pour conserver les données de l'utilisateur dans le navigateur? – SanchelliosProg

+1

Les navigateurs modernes offrent beaucoup plus que des cookies: stockage local/session, indexeddb et SQL Web. – Volker

Répondre

0

La solution consiste à écrire la variable proxy package.json pour obtenir des CORS

Par exemple, si le client est sur localhost:3000 et le serveur est sur localhost:8080, il faut ajouter:

"proxy": " http://localhost:8080/ "

et accéder à un chemin de serveur API avec le domaine du côté client, comme:

http://localhost:3000/set_coookie