2011-11-03 22 views
67

Tôi có nút này máy chủ chạy:làm thế nào để thực hiện auth đăng nhập trong Node.js

var server=http.createServer(function(request, responsehttp) { 
    if (request.method == 'POST') { 
     var body = ''; 
     request.on('data', function (data) { 
      body += data; 
     }); 
     request.on('end', function() { 
      var POST = qs.parse(body); 
      processquery(POST, request, responsehttp); 
     }); 
    } else { 
     var url_parts = url.parse(request.url, true); 
     var query = url_parts.query; 
     console.log(query); 
     processquery(query, request, responsehttp); 
    } 
}); 

Tôi muốn thêm hình thức đăng nhập cho máy chủ này .so khi người dùng được xác thực sau đó nó sẽ hiển thị.

function processquery(query, request, responsehttp){ 
    var returnResult = function (data){ 
     responsehttp.end(JSON.stringify(data)); 
    }; 

    if (!query.command) { 
     fileprocess(request, responsehttp); 
    } 
    responsehttp.writeHead(200, {"Content-Type": "application/json"}); 
    switch(query.command) { 
     case 'logout': 
      logout(query, returnResult); 
      break; 
     case 'login': 
      login(query, returnResult); 
      break; 
    }  
} 

chức năng truy vấn quá trình trở về các tập tin cho khách hàng nếu có lệnh không được đưa ra, vì vậy tôi có thể gửi các lệnh đăng nhập từ client tới server, nhưng những gì máy chủ nên làm gì khi nó nhận được lệnh đăng nhập với mật khẩu Tên truy nhập , làm thế nào nó sẽ bàn giao yêu cầu đăng nhập và trả về thành công hoặc thất bại đăng nhập, để viết phần này tôi cần trợ giúp.

những gì tôi đã thử.

function login(request, callback) { 
    if(request.username==users[request.username] && request.password==users[request.username].password) { 
     users[request.username].auth=true; 
     var data = {result:'success','message':'login successful'}; 
     callback(data); 
    } else { 
     var data = {result:'error','message':'login incorrect'}; 
     callback(data); 
    } 
} 

Vui lòng đề nghị làm cách nào để thêm phiên làm việc này mà tôi đã thử thêm, yêu cầu biến trong chức năng đăng nhập và thử đặt biến request.session là request.session không xác định.

Vui lòng đề xuất cách tôi có thể viết mô-đun đăng nhập này có thể duy trì xác thực đăng nhập đúng cho mọi người dùng.

+0

thực hiện với kết nối: http://blog.nodejitsu.com/sessions-and-cookies-in-node – XMen

Trả lời

224

Đây là cách tôi làm điều đó với Express.js:

1) Kiểm tra nếu người dùng được xác thực: Tôi có một chức năng trung gian tên CheckAuth mà tôi sử dụng trên tất cả các tuyến đường mà cần người dùng phải được xác thực:

function checkAuth(req, res, next) { 
    if (!req.session.user_id) { 
    res.send('You are not authorized to view this page'); 
    } else { 
    next(); 
    } 
} 

tôi sử dụng chức năng này trong các tuyến đường của tôi như thế này:

app.get('/my_secret_page', checkAuth, function (req, res) { 
    res.send('if you are viewing this page it means you are logged in'); 
}); 

2) Tuyến đăng nhập:

app.post('/login', function (req, res) { 
    var post = req.body; 
    if (post.user === 'john' && post.password === 'johnspassword') { 
    req.session.user_id = johns_user_id_here; 
    res.redirect('/my_secret_page'); 
    } else { 
    res.send('Bad user/pass'); 
    } 
}); 

3) Tuyến logout:

app.get('/logout', function (req, res) { 
    delete req.session.user_id; 
    res.redirect('/login'); 
});  

Nếu bạn muốn tìm hiểu thêm về Express.js kiểm tra trang web của họ vào đây: expressjs.com/en/guide/routing.html Nếu có cần để biết thêm công cụ phức tạp, thanh toán everyauth (nó có rất nhiều phương pháp xác thực có sẵn, cho facebook, twitter, vv; hướng dẫn tốt về nó here).

+1

Các tài liệu Express.js nói rằng bạn phải sử dụng trung gian kết nối để quản lý phiên làm việc. Mã của bạn vẫn có liên quan? – nimrodm

+0

Có, tôi đã viết mã ở trên với phần mềm trung gian kết nối cho phiên trong tâm trí (xem 'req.session' ở trên). Mã vẫn có liên quan. – alessioalex

+0

Tôi nghĩ 'delete res.session.user_id;' của bạn phải là 'delete req.session.user_id;'. –

5

Thực ra đây không thực sự là câu trả lời cho câu hỏi, nhưng đây là cách tốt hơn để làm điều đó.

Tôi khuyên bạn nên sử dụng connect/express làm máy chủ http vì chúng giúp bạn tiết kiệm rất nhiều thời gian. Bạn rõ ràng không muốn phát minh lại bánh xe. Trong trường hợp quản lý phiên của bạn dễ dàng hơn nhiều với kết nối/express.

Bên cạnh đó để xác thực, tôi đề nghị bạn sử dụng everyauth. Hỗ trợ rất nhiều chiến lược xác thực. Tuyệt vời để phát triển nhanh chóng.

Tất cả điều này có thể dễ dàng giảm xuống với một số thao tác sao chép từ tài liệu của họ!

2

Để thêm vào Farid của pseudo-câu trả lời,

Xem xét sử dụng Passport.js qua everyauth.

Câu trả lời cho this question cung cấp một số thông tin chi tiết về sự khác biệt.


Có rất nhiều lợi ích khi tải xuống xác thực người dùng của bạn cho Google, Facebook hoặc trang web khác. Nếu yêu cầu của ứng dụng của bạn là như vậy mà bạn có thể sử dụng Hộ chiếu làm nhà cung cấp xác thực duy nhất của bạn hoặc cùng với thông tin đăng nhập truyền thống, nó có thể làm cho trải nghiệm của bạn dễ dàng hơn cho người dùng của bạn.

1

@alessioalex answer là bản trình diễn hoàn hảo cho người dùng nút mới. Nhưng dù sao, thật khó để viết phần mềm trung gian checkAuth vào tất cả các tuyến trừ đăng nhập, vì vậy tốt hơn nên di chuyển checkAuth từ mọi tuyến đường đến một mục nhập bằng app.use. Ví dụ:

function checkAuth(req, res, next) { 
    // if logined or it's login request, then go next route 
    if (isLogin || (req.path === '/login' && req.method === 'POST')) { 
    next() 
    } else { 
    res.send('Not logged in yet.') 
    } 
} 

app.use('/', checkAuth) 
Các vấn đề liên quan