2016-06-21 25 views
2

我試圖建立與解析服務器簡單的認證系統:解析服務器登錄返回用戶,但req.user不確定

app.js

... 

app.get('/login', (req, res) => { 
    res.render('login.ejs'); 
}); 

app.post('/login', (req, res) => { 
    console.log('POST /login\t' + util.inspect(req.body)); 
    driver.login(req, (err, user) => { 
     //Here, user is defined 
     if(err) { 
      res.redirect('/login'); 
     } else { 
      res.redirect('/user'); 
     } 
    }); 
}); 

... 

driver.js:

... 

function login(req, callback) { 
    var username = req.body.username, 
     password = req.body.password; 
    Parse.User.logIn(username, password, { 
     success: (user) => { 
      callback(); 
     }, 
     error: (user, error) => { 
      callback(JSON.stringify(error)); 
     } 
    }); 
} 

function isLoggedIn(req, callback) { 
    console.log('isLoggedIn?'); 
    console.log(util.inspect(req.user)); //undefined 
    if(req.user) { 
     callback(); 
    } else { 
     callback('Not logged in'); 
    } 
} 

... 

當我訪問/login,我可以登錄就好了,並重定向到/user沒有任何錯誤,但/user,它使用isLoggedIn爲一箇中間件,req.user未定義。

我在搜索過程中看到其他人遇到同樣的問題,但是使用JSSDK(反應/瀏覽器)的另一部分,或者沒有得到任何答案的帖子都是舊的(< 2015)。

我知道我可以使用會話,並基於此每次重新創建用戶,但它感覺真的很駭人,它真的是支持的方式嗎?

+0

DrakaSAN - 你想怎麼支持會話的會話和存儲數據?正如@ sookool99提到的 - 你需要一個更多的抽象層。 –

回答

2

你有兩條路線可以走,要麼有一個REST-full服務器,這意味着用戶在路由調用,STATE-full和使用會話之間不是永久的。

幸運的是,有一個非常好的nodejs身份驗證中間件已經構建,可處理所有此會話管理。這稱爲passportJS。文檔可以在這裏找到:http://passportjs.org/docs

您不僅可以通過本地登錄進行身份驗證,但支持谷歌,臉譜,github等認證。這是通過所謂的策略完成的。你使用谷歌的戰略爲谷歌oauth,facebook的stradegy爲Facebook oauth等

你會尋找的是一個本地戰略,這就是所謂的這是因爲你想用本地用戶憑證進行身份驗證。這種策略可以在這裏找到:https://www.npmjs.com/package/passport-local

你既需要護照和護照地方和安裝簡單地運行

npm install passport passport-local 

從那裏,只是經過我上面已經掛了如何一切設置文檔。

+0

我知道護照,問題是認證後我想使用Parse,所以護照不是真正的解決方案。 – DrakaSAN

+0

@DrakaSAN你最終如何解決這個問題?你是否按照建議使用Passeport或有更好的做法?我處於完全相同的情況。 – tsnkff

+1

@blablabla:作爲回答發表:) – DrakaSAN

1

要開發我對blablabla評論的答案,誰問我最終使用的是什麼。

在我的情況下,我開發了一個REST API,並且會話數據一旦連接就不會改變。

因此,我所做的是將會話委託給客戶端,並使用JWT完全無狀態。

當客戶端被驗證時,我使用Json Web Token加密他的會話數據併發送給他。當他嘗試訪問受保護的頁面時,他向我發送了我可以解密的JWT,並根據其中的信息重新創建req.user

我中間件是這樣的:

function isLoggedIn(req, res, next) { 
    //If there is a token 
    if(req.headers != null && req.headers.token != null) { 
     //Verify it and extract the user's data 
     verify(req.headers.token, (err, user) => { 
      if(err != null) { 
       res.status(401); 
       res.json({error: err}); 
      } else { 
       //Recreate req.user 
       req.user = user; 
       next(); 
      } 
     }); 
    } else { 
     res.status(401); 
     res.json({error: 'No token'}); 
    } 
} 

function verify(token, callback) { 
    //Verify the token 
    jwt.verify(token, jwtSecret, (error, user) => { 
     if(error != null) { 
      callback(error); 
     } else { 
      Separately check if logged into Parse 
      parse.isLoggedIn(user, (error, loggedIn) => { 
       if(error != null) { 
        callback(error); 
       } else if(!loggedIn) { 
        callback('Not logged in the Parse'); 
       } else { 
        callback(null, user); 
       } 
      });    
     } 
    }); 
} 
相關問題