2013-04-01 38 views
0

我一直在試驗Ember.js和Node.js,並且遇到了問題。我使用標準的Express.session系統在服務器上保護了我的API路由,但是當這些API服務於Ember.js應用程序時,我遇到了一個問題。由於Ember應用程序無法將值存儲在req.session中,因此我的應用程序無法運行。我應該如何做我的身份驗證,以便我仍然可以會話保護我的API?下面是我的一些當前服務器登錄代碼:Ember.js + Node.js身份驗證/會話不能使用Express.Session

一個 「檢查登錄」 功能:

TypeError: Cannot read property 'user' of undefined 

中間件設置:當灰燼發出請求

var checkLogin = function(req, res, callback) { 
    if (req.session.user) { 
     callback(); 
    } else { 
     res.send({error: "AuthRequired"}); 
    } 
    }; 

錯誤:

app.configure(function() { 
    app.use(express.bodyParser()); 
    app.use(express.static(__dirname + '/static/')); 
    app.use(express.cookieParser(<SECRET>)); 
    app.use(express.session()); 
    //to not care about invalid JSON requests 
    app.use(function(err, req, res, next) { 
    if (err.message == 'invalid json') { 
     next() 
    } else { 
     next(err) 
    } 
    }); 
}); 
+0

您可以發佈您的快速應用程序配置(中間件等)嗎?用中間件信息更新了 – robertklep

+0

。 –

+0

難道你是在你的路線之後宣佈你的中間件?否則,我不明白爲什麼'req.session'可能是未定義的(當客戶端不發送會話cookie時,仍然會創建'req.session',只是一個空的)。 – robertklep

回答

3

你試過Passport
該中間件會將用戶添加到您的會話中,我建議您嘗試使用passport-local提供程序。
網站上的指南可能不是完全有效的代碼,你最好參考git回購上的example文件夾。

UPDATE: 這可能是配置序列不好。 這裏是我的配置Locomotive服務器(取代thisapp),試試看。

this.use(poweredBy(null)); 
this.use(express.favicon()); 
this.use(express.logger('dev')); 
this.use(express.compress()); 
this.use(express.cookieParser()); 
this.use(express.static(__dirname + '/../../public'), { maxAge: 60*10*1000 }); 
this.use(express.bodyParser()); 
this.use(express.methodOverride()); 
this.use(express.session({ secret: '<SECRET>' })); 
// Initialize Passport! Also use passport.session() middleware, to support 
// persistent login sessions (recommended). 
this.use(flash()); 
this.use(passport.initialize()); 
this.use(passport.session()); 
this.use(this.router); 
+0

問題在於它正是我之前所做的:來自客戶端的AJAX請求仍然沒有cookie /會話。我可能會爲請求實現我自己的簡單標記系統。 –

+0

我懷疑它可能是一個設置問題,你是否嘗試運行'passport-local'示例代碼? – leesei

+0

我的意思是護照會話存儲在請求中(我認爲)。這意味着當客戶端發出請求時,會檢查會話變量是否存儲在該請求中。當我登錄到我的服務時,它會在瀏覽器上設置一個cookie(我認爲)。但是,當我從我的Ember客戶端發出請求時,AJAX不是來自我的瀏覽器,並且無法訪問我的cookie。糾正我,如果我錯了,但這可能是我的系統目前無法正常工作。 –