Mam serwer z pojedynczym węzłem, który odpowiada na żądania i przekierowuje użytkownika na podstawie nagłówków hosta. Jest tak, że strona statyczna/główna znajduje się na stronie www, a każdy użytkownik ma swoją własną domenę podrzędną (np. Www.example.com i site.example.com). Trasowanie odbywa się zgodnie z witryną.js.Używanie Express i Node, jak utrzymać sesję między subdomenami/hostheaders
Gdy użytkownik nie jest zalogowany, zostaje przekierowany do logowania.
Odkrywam, że sesja nie jest utrzymywana, gdy użytkownik jest przekierowywany do swojej poddomeny. Sądzę, że to jest oczekiwane, ale zastanawiam się, czy istnieje sposób na utrzymanie tej samej sesji w obu subdomenach.
Miałem nadzieję, że po zalogowaniu i powrocie na stronę www.example.com zobaczą inny widok zawierający link do wylogowania/ich pulpitów itp. Moje obejście w tym momencie, myślę, to po prostu utworzyć sesję na poddomenie i jeśli powrócą na stronę www, będzie po prostu tak, jakby nie byli zalogowani.
Ktoś poradził sobie z tym wcześniej lub ma odpowiedzi na temat obchodzenia się z sesjami w ten sposób?
Myślę, że problem może być w users.js gdzie przekierować do „http://site.example.com” jak jej nie względnej ścieżki ...
Oto odpowiedni kod (użytkownik wyszukiwanie odbywa się za pomocą MongoDB i zostawiłem go w jego pracy w porządku - linię, która wywołuje usługa ta jest users.authenticate) ...
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
przetestować go lokalnie na OSX, dodałem www.example.com i site.example.com w moim pliku hosts tak, że zapytania DNS uzyskać miejscowego.
użytkownik '$ .ajaxSetup', aby dodać' withCredentials: true' do każdego żądania – Xerri
@Maksims "Korzystanie z domeny nie będzie działać dobrze na localhost" - dlaczego nie działa na localhost? Mam: api.localhost: 3000 i localhost: 3000 - nie działa? : \ – AmpT
Ponieważ ze względu na bezpieczeństwo przeglądarki plik cookie nie zostanie wysłany, jeśli bieżąca domena nie jest zgodna ze zdefiniowaną domeną. W przypadku środowisk programistycznych i scenicznych można po prostu skomentować własność domeny lub ustawić ją na "localhost". – moka