2015-01-26 13 views
6

Sử dụng Passport.js trong Nút, có cách nào để tôi cho phép một người dùng mạo danh người khác không? ví dụ. với tư cách là Quản trị viên trong ứng dụng, tôi muốn có thể đăng nhập với tư cách người dùng khác mà không biết mật khẩu của họ.Làm cách nào để mạo danh người dùng khác bằng Passport.js trong Nút?

Đơn giản nhất, tôi sẽ hài lòng nếu tôi có thể thay đổi dữ liệu người dùng được tuần tự hóa (ID người dùng) để khi deserializeUser được gọi là nó sẽ giả định danh tính của người dùng thay thế. Tôi đã thử thay thế giá trị tại req._passport.session.user và giá trị tại req.session.passport.user nhưng hiệu ứng ròng chỉ là phiên của tôi dường như không hợp lệ và Hộ chiếu đăng xuất tôi.

Trả lời

9

Hộ chiếu cung cấp phương thức req.logIn trong trường hợp bạn muốn thực hiện xác thực theo cách thủ công. Bạn có thể sử dụng nó để đăng nhập bất kỳ người dùng nào ngay cả khi không xác thực.

Đây là cách bạn có thể sử dụng. Đăng nhập Quản trị viên bình thường, người sẽ có một bộ cờ isAdmin.

Sau đó đặt phần mềm trung gian trước passport.authenticate trong tuyến đăng nhập của bạn. Điều này sẽ đăng nhập mới người dùng chỉ dựa trên tên người dùng của họ, nếu hiện tại người dùng đã đăng nhập isAdmin.

app.post('/login', 

    function forceLogin(req, res, next) { 
     if (!req.user.isAdmin) return next(); // skip if not admin 
     User.findOne({ 
      username: req.body.username // < entered username 
     }, function(err, user) { 
      // no checking for password 
      req.logIn(user); 
      res.redirect('/users/' + user.username); 
     }); 
    }, 

    passport.authenticate('local'), 
    function(req, res) { 
     res.redirect('/users/' + req.user.username); 
    } 
); 
+1

Đây là những gì tôi đã bỏ lỡ! Cảm ơn bạn! – user2719094

1

Câu trả lời cho câu hỏi của bạn là về cơ bản: không. Lý do là: thư viện phiên đang được sử dụng 99% thời gian là ký các cookie, vì vậy nếu bạn làm xáo trộn dữ liệu, máy chủ web sẽ từ chối nó.

Cách xung quanh việc này là viết chiến lược xác thực hộ chiếu của riêng bạn mà rõ ràng là không làm điều này, nhưng tôi giả định bạn đang nói về làm việc với các chiến lược dựng sẵn ở đây.

+0

Cảm ơn. Tôi đã thử tạo một chiến lược mới (các chiến lược hiện tại của tôi về cơ bản là từ đây: http://code.tutsplus.com/tutorials/authenticating-nodejs-applications-with-passport--cms-21619), nhưng không thể làm được công việc. Tôi cho rằng đó là vì tôi đang cố gắng gọi phương thức xác thực hộ chiếu trong khi người dùng đã đăng nhập. Làm cách nào để "xác thực lại" người dùng đã đăng nhập? – user2719094

+0

Bạn không chắc chắn ý mình là gì? Cách xác thực người dùng (bất kỳ lúc nào) là qua hộ chiếu trung gian của hộ chiếu.authenticate =) Bạn có thể gọi trực tiếp điều này với một cuộc gọi lại của riêng bạn nếu bạn muốn. Điều này có thể tốt hơn cho một bài SO mới mặc dù! – rdegges

+0

Tôi không đồng ý, nhưng tôi sợ tôi sẽ không nhận được câu trả lời trừ khi tôi làm ... Câu hỏi ban đầu của tôi là "làm thế nào một người dùng có thể mạo danh người khác bằng Passport.js?" Thảo luận phiên chỉ là một cách tôi nghĩ * có thể * làm việc, nhưng dường như nó sẽ không. Tôi vẫn không có câu trả lời cho câu hỏi ban đầu của mình. Có cách nào khác để THAY ĐỔI người dùng mà Passport cho là đã đăng nhập không? – user2719094

2

Tôi có một cách khác để mạo danh, bởi vì:

  • Tôi không muốn gây rối với internals xác thực/Hộ chiếu như lưu trữ phiên/đăng nhập/vv Bạn phải hiểu họ thực sự tốt và cũng có thể dễ thay đổi vì vậy tôi cho rằng đây không phải là tùy chọn cho tôi.
  • Ngoài ra, tôi vẫn muốn có thể biết hành động được thực hiện từ superuser (mạo danh) hoặc người dùng thông thường (không mạo danh).

Những gì tôi làm là:

  • Có một con đường cho người sử dụng với vai trò trị cấp cao để mạo danh, như /superadmin/impersonate?username=normaluser1 mà đặt req.user.impersonated.userid = normaluser1.userid

  • Sau đó, tôi có một trung gian, trong đó kiểm tra nếu người dùng superadmin và bị mạo danh:

    nếu (req.user.isAdmin & & req.user.impersonated) { req.user.userid = req.user.impersonated.userid; }

Ngoài ra, tôi đã tìm thấy this là một bài viết hay về mạo danh người dùng. Tương tự như cách tiếp cận của tôi, và tốt cho cảm hứng để xây dựng một cái gì đó tương tự.

Các vấn đề liên quan