2012-12-26 116 views
2

我目前正在使用Node.jsExpress.js構建一個web應用程序。Node.js用戶名和密碼認證

我正在尋找一種方式來與我的主要app.js文件中的用戶名和密碼,在http://www.domain.com/login聽了一post請求一個簡單的服務器端認證:

app.js

app.post('/login', function(req, res) { 
    // some server-side code for a username and password 
} 

在客戶端,我有一個帶有用戶名和密碼的簡單登錄表單。這種形式將發佈到服務器:

的index.html

<form method="post" action="/login"> 
<input type="text" id="user" name="user" /> 
<input type="password" id="pass" name="pass" /> 
<button type="submit">Login</button> 
</form> 

我期待實現這一使用任何ExpressJS插件。

編輯:所以我的問題是,如何在ExpressJS和NodeJS中實現簡單的用戶名和密碼認證?

+0

你能更具體嗎?你實際上沒有問過問題。 – JohnnyHK

+0

http://devsmash.com/blog/password-authentication-with-mongoose-and-bcrypt – chovy

回答

0

I found the answer我一直在尋找使用附帶ExpressJSConnect中間件,沒有需要使用Cookie或在另一個節點模塊添加:

var express = require('express'); 

function authorize(username, password) { 
    return 'someone' === username & 'password' === password; 
} 

var app = express.createServer(
    express.basicAuth(authorize) 
); 

app.get('/', function(request, response) { 
    response.send('Authorized!'); 
}); 

console.log('Starting server...') 
app.listen(8080); 

運行應用程序並導航到http://localhost:8080後,它會提示爲用戶名和密碼。 Simples。

+2

只是想補充說明,對於Express的最新版本,這是行不通的。你可以簡單地使用:app.use(express.basicAuth('user','password')); – bakytn

3

這很簡單。 ExpressJS是一個超級小型框架,它建立在Node.js中的基本http服務器的頂層,並連接一個節點模塊。

要製作身份驗證系統,您需要使用會話。首先,你需要調用這一行:

app.use(express.cookieSession()); 

然後你就可以使用req.session存儲和加載會話。

app.post('/login', function(req, res) { 
    if (req.session.username & req.session.password != null) { 
     // Already logged in. 
    } else { 
     var q = db.query("SELECT * FROM `users` WHERE `username`='" + req.params.username + "' AND `password`='" + req.params.password + "'"); 

     if (q) { 
      // Set the sessions. 
      req.session.username = req.params.username; 
      req.session.password = req.params.password; 
     } 
    } 
}); 

一個基本的例子。你一定要清理輸入並保護它,但它應該讓你開始。

8

通過使用ExpressJS會話,您可以持有會話cookie。您需要cookieParser和會話存儲。但是如果你不想擴展這個ExpressJS功能(這是我從你的消息中理解的),你應該用一個令牌或一個祕密的臨時字符串管理你自己的會話。

儘管我強烈建議您使用ExpressJS會話,但您無需使用ExpressJS cookie即可完成此操作。

  • 在每次登錄時,創建一個唯一的令牌並將其存儲以供將來查找。
  • 在每個請求上,從客戶端發送該令牌並在服務器上進行檢查。重定向到登錄如果令牌是無效

這裏是登錄代碼示例:

app.post("/login", function(req, res) { 
    if(req.body.username && req.body.password) { 
     // check username and password 
     if(authenticated) { 
      // create a token and store it with the current date (if you want it to expire) 
      var token = generateAndStoreRandomString(req.body.username); 
      res.redirect("http://your.domain/path?token=" + token); 
      return; 
     } 
     // Do something if username or password wrong 
    } 
    // Do something if no username or password 
}); 

現在,在每次請求:

app.get("somePath", function(req, res) { 
    if(!req.query.token) { 
     res.redirect("http://your.domain/login"); 
     return; 
    } 
    // Check token in database, if it exists and it hasn't expired 
    if(!authenticated) { 
     res.redirect("http://your.domain/login"); 
     return; 
    } 
    // The user is authenticated. Do the actions required by "somePath" 
}); 

嘗試有一個過程清理偶爾會過期令牌,因爲它們最終會加起來。如果你想使用ExpressJS cookieParser和會話存儲,那麼有很多文章和例子。如果您遇到麻煩,請發表另一個問題。

我會重複自己,嘗試使用ExpressJS會話。如果您使用http而不是https,則可以輕鬆劫持此方法。

+0

+1 - 感謝您的詳細解答! –