Làm cách nào để biết người dùng đã đăng nhập bằng passport.js?


104

Tôi đã đọc passport.jsthông tin và mẫu trong hai ngày, nhưng tôi không chắc sau đó tôi đã thực hiện tất cả quá trình xác thực hay chưa.

Làm cách nào để biết tôi đã đăng nhập, ví dụ: tôi sẽ có thanh điều hướng với nút đăng nhập hoặc đăng xuất, có một số biến như mã bên dưới không?

if (login)
   <button>logout</button>
else 
   <button>login</button>

Câu trả lời:


210

Nếu người dùng đã đăng nhập, passport.jssẽ tạo userđối tượng reqcho mọi yêu cầu express.js, bạn có thể kiểm tra sự tồn tại trong bất kỳ phần mềm trung gian nào:

if (req.user) {
    // logged in
} else {
    // not logged in
}

Bạn có thể tạo express.jsphần mềm trung gian đơn giản để kiểm tra xem người dùng đã đăng nhập chưa và nếu chưa - sẽ chuyển hướng đến /logintrang:

function loggedIn(req, res, next) {
    if (req.user) {
        next();
    } else {
        res.redirect('/login');
    }
}

Và sử dụng nó:

app.get('/orders', loggedIn, function(req, res, next) {
    // req.user - will exist
    // load user orders and render them
});

Nó là toàn cầu? Tôi có thể truy cập nó trong tất cả dự án sau khi đăng nhập không?
RMontes

3
nó không toàn cục nó chỉ trên đối tượng yêu cầu.
siêu tân tinh

1
Trong 98,8% phát triển web với express.js và passport.js, bạn sẽ xử lý các yêu cầu (app.get, app.post, v.v.), vì vậy việc nói về việc sử dụng passport.js ngoài nó là một điều vô nghĩa. Có, nó chỉ nằm trong các trình xử lý phần mềm trung gian tuyến nhanh app.get, app.postv.v. Nếu bạn cần chức năng khác, thì bạn nên giải thích chi tiết trong câu hỏi của mình cũng như những gì bạn đang cố gắng đạt được.
moka

2
Tôi nhận thấy rằng nếu tôi không cung cấp cho router.get () bất kỳ phần mềm trung gian nào để kiểm tra xác thực, chẳng hạn như trong "router.get ('/', my_controller.index)", thì hộ chiếu sẽ không bao giờ được hỏi ý kiến ​​và req.user sẽ luôn không được xác định. Điều này thật khó chịu vì tôi muốn cho phép bất kỳ khách truy cập nào gọi một API, nhưng điều chỉnh nội dung của phản hồi tùy thuộc vào người đang yêu cầu.
Lawrence I. Siden

2
Ai đó có thể giải thích làm thế nào điều này là không thể khai thác? Việc kiểm tra đó chỉ đơn giản là xem họ có phải là đối tượng người dùng trong yêu cầu hay không. Xác thực phiên ở đâu?
rambossa

46

Nếu bạn muốn sử dụng nó trong các mẫu của mình vì mẫu mã của bạn dường như chỉ ra rằng bạn có thể tạo một số phần mềm trung gian như sau:

app.use(function (req, res, next) {
  res.locals.login = req.isAuthenticated();
  next();
});

Đặt mã đó ở đâu đó sau khi bạn đã thiết lập hộ chiếu.

Và sau đó sử dụng nó trong mẫu của bạn (ví dụ swig)

{% if login %}
<button>logout</button>
{% else %} 
<button>login</button>
{% endif %}

Vì một số lý do mà phần mềm trung gian ở trên đã gây cho tôi sự cố với việc người dùng không được xác định trong mẫu của tôi. Tôi đã phải cung cấp lại đối tượng người dùng cho chế độ xem để sửa nó như vậy: app.use(function(req,res,next){ res.locals.login = req.isAuthenticated(); res.locals.user = req.user; next(); });
Tebbers

Ngay cả sau khi xác thực thành công, vẫn isAuthenticatedcho sai trong yêu cầu tiếp theo. Bạn có thể giúp trả lời câu hỏi này stackoverflow.com/questions/42842171/…
Suhail Gupta

3

Nó không được ghi rõ ràng nhưng có một isAuthenticated()phương pháp được đưa vào reqbằng hộ chiếu .
Có thể được sử dụng như sau,

req.isAuthenticated() // returns true if auth, false if not

// auth.js
module.exports = {
  ensureAuthenticated: (req, res, next) => {
    if (req.isAuthenticated()) {
      return next()
    }
    res.redirect('/login') // if not auth
  },

  forwardAuthenticated: (req, res, next) => {
    if (!req.isAuthenticated()) {
      return next()
    }
    res.redirect('/dashboard');  // if auth    
  }
}

// app.js
app.get('/dashboard', ensureAuthenticated, (req, res) => res.render('dashboard'))
app.get('/login', forwardAuthenticated, (req, res) => res.render('login'))
app.get('/register', forwardAuthenticated, (req, res) => res.render('register'))

2

Tôi đã tìm kiếm giải pháp như vậy và xem qua trang này. Câu hỏi là làm thế nào để kiểm tra trạng thái đăng nhập ở phía máy khách.

Sau khi đăng nhập, tôi ẩn nút Đăng nhập và hiển thị nút đăng xuất. Khi làm mới trang, tôi lại thấy nút đăng nhập thay vì nút đăng xuất. Giải pháp duy nhất là lưu một mục trong sessionStorage nếu bạn đang sử dụng session (và localStorage nếu bạn đang sử dụng JWT). Xóa mục này khi bạn đăng xuất. Sau đó, trong mỗi lần tải trang, hãy kiểm tra mục sessionStorage này và thực hiện tương ứng.

if (sessionStorage.getItem('status')) {
    $("#btnlogout").show();
    $("#btnlogin").hide();
// or what ever you want to do
} else {
    $("#btnlogout").hide();
    $("#btnlogin").show();
}



function Login() {
            var data = {
                username: $("#myModal #usr").val(),
                password: $("#myModal #pw").val()

            };
            $.ajax({
                type: 'POST',
                url: '/login',
                contentType: 'application/JSON; charset=utf-8',
                data: JSON.stringify(data),
                success: funcSuccess,
                error: funcFail
            });
            function funcSuccess(res) {
                sessionStorage.setItem('status', 'loggedIn');

                $("#btnlogout").show();
                $("#btnlogin").hide();
            }
            function funcFail() { $("#pp").text('Login Failed'); };
        };

function Logout() {
    $.ajax({
        type: 'GET',
        url: '/logout',
        contentType: 'application/JSON; charset=utf-8',
        success: funcSuccess,
        error: funcFail,
    });
    function funcSuccess(res) {
        $("#btnlogout").hide();
        $("#btnlogin").show();
        sessionStorage.removeItem("status");
    };
    function funcFail() { alert('Login method Failed'); };
}; 

2

sử dụng mã bên dưới bên trong app.get () hoặc router.get ()

router.get('/edit/:id', (req, res)=>{
  if(req.isAuthenticated()){
     if(req.isAuthenticated()){
      //

      }
  else{
   res.redirect('/users/login');//your particular login routes
     }
});

0

Câu hỏi hay, tôi đã gặp một số vấn đề khi cố gắng triển khai một cái gì đó như thế này, khi có một yêu cầu chưa được xác thực, thanh điều khiển sẽ bỏ qua khối if nếu biến res.locals trả về giá trị sai. Để giải quyết vấn đề này, bạn cần thiết lập một phần mềm trung gian trong tệp app.js của mình để cung cấp req.user trên toàn cầu trong ứng dụng của bạn.

app.use(function (req, res, next) {
res.locals.login = req.user;
next();

});

Trong tệp tiêu đề của bạn, bạn có thể thực hiện việc kiểm tra người dùng đã xác thực này và hiển thị theo nội dung như vậy ..

                {{#if login }}
                    <li><a href="#">User Account</a></li>
                    <li role="separator" class="divider"></li>
                    <li><a href="#">Logout</a></li>
                {{/if}}
                {{#unless login}}
                    <li><a href="#">Sign up</a></li>
                    <li><a href="#">Sign in</a></li>
                {{/unless}} 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.