Utilisation d'Express et de Node, comment gérer une session entre des sous-domaines / hostheaders
J'ai un seul nœud serveur qui répond aux demandes et redirige l'utilisateur basée sur les en-têtes d'hôte. L'usage est que le statique/page d'accueil du site vie au www et chaque utilisateur dispose de son propre sous-domaine (c'est à dire www.example.com et site.example.com). Le routage est que par site.js.
Lorsque l'utilisateur n'est pas connecté ils sont redirigé vers la de login.
Je suis en train de découvrir que la session n'est pas conservée lorsque l'utilisateur est redirigé vers leur sous-domaine. Je suppose que c'est prévu, mais je me demande si il existe un moyen de maintenir la même session sur les deux sous-domaines.
J'espérais que si elles ont été enregistrées et à retourner à www.example.com ils verraient d'un point de vue différent qui inclus un lien de déconnexion /leur tableau de bord, etc. Ma solution pour le moment, je pense, est de créer de la session sur leur sous-domaine et si ils reviennent sur www, il va juste être comme si ils ne sont pas connectés.
Personne traitée avant ou avoir des réponses sur la façon de gérer les sessions de cette manière?
Je pense que le problème peut être dans users.js où je me rediriger vers 'http://site.example.com" comme ce n'est pas un chemin d'accès relatif...
Voici le code (l'utilisateur recherche est effectuée à l'aide de MongoDB et j'ai laissé comme sa fine la ligne qui appelle ce service est utilisateurs.authentifier)...
server.js:
app.configure ->
app.set "views", "#{__dirname}/views"
app.set "view engine", "jade"
app.use express.bodyParser()
app.use express.methodOverride()
app.use express.cookieParser()
app.use express.session {
key: "KEY",
secret: "SECRET",
store: new MemoryStore(),
cookie: {
domain: 'example.com',
maxAge : 1000*60*60*24*30*12
}
}
app.use express.static "#{__dirname}/public"
app.use express.logger "short"
app.use express.favicon "#{__dirname}/public/img/favicon.ico"
app.use app.router
site.js:
module.exports = (app) ->
app.get '/', (req, res) ->
console.log "/hit with #{req.url} from #{req.headers.host}"
domains = req.headers.host.split "."
org = if domains then domains[0] else "www"
if org == "www"
res.render "index", { layout: null }
else
if req.session.user
console.log "session established"
res.render "app", { layout: null }
else
console.log "no session"
res.redirect "http://www.example.com/accounts/login"
users.js:
users = require('../services/users')
module.exports = (app) ->
app.get "/accounts/login", (req, res) ->
res.render "login", { layout: null, locals: { returnUrl: req.query.returnUrl } }
app.post "/accounts", (req, res) ->
users.authenticate app, req.body.login, req.body.password, (user) ->
if user
req.session.user = user
res.redirect "http://#{user.orgName}.example.com"
else
res.render "login", { layout: null, locals: { returnUrl: req.body.url } }
app.get "/accounts/logout", (req, res) ->
console.log "deleting user from session"
delete req.session.user
res.redirect "http://www.example.com
De le tester en local sur mac OSX, j'ai ajouté www.example.com et site.example.com dans mon fichier hosts afin que les recherches DNS sont gérés localement.
source d'informationauteur mattgi
Vous devez vous connecter pour publier un commentaire.
Tout d'abord à autoriser le navigateur à faire des requêtes inter-domaine, vous devez définir les en-têtes sur le côté serveur. Cette solution fonctionne pour normal de la demande ainsi que de l'AJAX.
Dans votre express configurer la fonction:
Express 4.0:
Access-Control-Allow-Origin peut être réglée sur '*' si pas de contre-domaine cookies échange de séances nécessaires.
Les cookies de session et partagée de la croix-domaine, vous devez définir spécifique Access-Control-Allow-Origin à fait domaine où la demande est faite à partir d', c'est pourquoi req.les en-têtes.origine - est parfait pour cela.
À l'aide de domaine il l'habitude de travailler bien sur localhost - alors assurez-vous de désactiver dans un environnement de développement, et de l'activer sur la production. Il permettra partagé les cookies à travers le dessus et les sous-domaines.
Ce n'est pas tout.
Les navigateurs de soi de ne pas envoyer des "cookies" sur la croix de domaine de demandes, et ce doivent être forcés.
En jQuery, vous pouvez ajouter un paramètre $.ajax() demande:
Pour les non jQuery, il suffit d'avoir XHR constructeur et définissez ce paramètre:
Et vous êtes prêt à faire inter-domaine, avec partage de session.
Avez-vous assurez-vous que vous avez vos cookies définis pour le domaine de premier niveau afin de pouvoir être lu par tous les sous-domaines? Ensuite, c'est juste une question ou la persistance de vos données de session dans la mémoire, db, comme d'habitude. Je n'ai pas ma machine de dev et en cours d'exécution, mais ça va être quelque chose comme ceci dans votre application.configurer().
Remarque: Si vous utilisez Express 4 et le nouveau cookie de session module, le code ressemble à
Ce peu de moi, mais l'API a changé.