2016-08-07 15 views
11

Tôi có một ứng dụng web đơn giản có màn hình đăng nhập và trang hoạt động chỉ khả dụng khi người dùng đã cung cấp bằng chứng xác thực hợp lệ. Giả sử người dùng nhấp vào đăng nhập bằng thông tin đăng nhập hợp lệ và được chuyển hướng đến trang hoạt động.Now người dùng không nhấp vào đăng xuất, thay vào đó họ chỉ cần nhấp vào nút quay lại của trình duyệt và quay lại trang đăng nhập. Hành vi này rõ ràng là không trực quan, tôi sẽ giả định trong khi người dùng đăng nhập và anh/cô ấy nhấp vào nút quay lại để duy trì trên cùng một trang và không quay lại trang đăng nhập.Người dùng nhấp vào nút quay lại trong khi phiên vẫn được xác thực và được chuyển hướng đến trang đăng nhập trong node.js

function loginUser(req, res) { 
    if (req.session.auth) // if user is still authenticated 
    { 
     res.redirect('/activity'); 
    } 
    res.render('login'); 
} 

Đây là cách đơn giản tôi luôn chuyển hướng người dùng trở lại trang hoạt động, tuy nhiên tôi thấy đây là phương pháp lãng phí tài nguyên vì có các chuyển hướng không mong muốn được giới thiệu. Câu hỏi của tôi là, đây là cách tiêu chuẩn và sạch nhất để thực hiện hành vi trên hay liệu có một cơ chế tốt hơn? Tôi đang sử dụng hộ chiếu để xác thực và lưu trữ thẻ jwt.

EDIT: Để lặp lại giải pháp trên chỉ hoạt động nếu trình duyệt không có bộ nhớ cache được bật, trái với bộ điều khiển cho tuyến đăng nhập thậm chí không được gọi vì trình duyệt đã lưu vào bộ nhớ cache của trang. Tôi đang tìm thứ gì đó mạnh mẽ hơn. Tôi không nghĩ rằng thực hành tốt là khó mã hóa trình duyệt để không lưu vào bộ nhớ cache trang trong môi trường sản xuất.

+1

Bạn không thể kiểm soát trình duyệt hoặc sửa đổi lịch sử của nó vì lý do bảo mật rõ ràng, vì vậy bạn đã thực hiện khá nhiều. Điều duy nhất có thể bị thiếu là đảm bảo kiểm tra mã của bạn nếu người dùng được đăng nhập hay không được thực hiện mỗi lần, do đó bạn cần đảm bảo rằng trang đăng nhập không thể được lưu trong trình duyệt. – HiDeo

+0

Bạn có thể muốn xem xét JWT. Xem thư viện Satellizer trên github. –

Trả lời

3

Một trong những "tính năng" của (hầu hết) trình duyệt hiện đại là việc nhấp vào nút quay lại sẽ điều hướng bạn trở lại trạng thái mà trang đó đã được tải. Trừ khi bạn tự động cập nhật trang đăng nhập trước khi điều hướng đến trạng thái đăng nhập, đây là trải nghiệm bạn sẽ nhận được. Thay vào đó, những gì tôi đề xuất thay vì được xác thực ngay lập tức trên trang đăng nhập, thay vì ngay lập tức chuyển hướng người dùng đến trạng thái đăng nhập, hãy cập nhật trang đăng nhập để cho biết người dùng hiện đã đăng nhập (vd: nếu bạn có biểu tượng avatar/hồ sơ ở trên cùng bên phải, thay đổi giao diện của nó bằng .js để cho biết người dùng đã đăng nhập).

Khi trạng thái của chế độ xem đăng nhập đã được thay đổi, sau đó điều hướng đến chế độ xem nội dung thích hợp (sử dụng chuyển hướng meta có thể là thích hợp nhất, nhưng bạn có thể thực hiện theo cách bạn muốn).

Bạn có thể giả định rằng vì người dùng đã nhấp vào nút quay lại, họ có thể muốn. Giải pháp này đảm bảo rằng sự mong đợi của người dùng về hành vi nút quay lại được tôn trọng, trái ngược với việc buộc chuyển hướng bằng cách phát hiện cookie với js và điều hướng lại - dẫn đến các vòng chuyển tiếp/quay lại (tức là quá bực bội!)

trong khi StackOverflow không thực sự làm những gì bạn đang cố gắng để làm, đây là một ví dụ về những gì bạn có thể làm với .js để tự động cập nhật /login trước khi bạn điều hướng đi:

enter image description here enter image description here

1

Giải pháp của bạn có vẻ ổn. Bạn có thể cải thiện ý tưởng của mình bằng cách sử dụng các sự kiện window.onbeforeunload và window.onunload. Một cái gì đó như thế này:

<script type="text/javascript"> 
    window.onbeforeunload = onbeforeunload_handler; 
    window.onunload = onunload_handler; 
    function onbeforeunload_handler() { 
     // Do something here 
    } 

    function onunload_handler() { 
     // Or do something here 
    } 
</script> 
1

Tôi không thử nghiệm điều này nhưng tôi nghĩ nó sẽ hoạt động. Hãy thử js res.redirect('/activity?_='+ Date.now()); để ngăn trình duyệt sử dụng trang được lưu trong bộ nhớ cache.

1

Bạn có một vài giải pháp ở đây.

Một, sẽ là yêu cầu trình duyệt không lưu vào bộ nhớ cache/đăng nhập. Điều này có ý nghĩa vì nhiều lý do. Về vấn đề bạn không muốn tắt bộ nhớ cache trong quá trình sản xuất, hãy nhớ rằng bạn sẽ tắt bộ nhớ cache chỉ cho trang/đăng nhập, điều này không tệ.

Một cách khác là thêm một số mã JS vào trang/đăng nhập để xem liệu một cookie đã đăng nhập có tồn tại hay không. Trong trường hợp đó, chỉ cần làm mới trang. Bằng cách làm mới trang, mặt sau sẽ được thực thi và chuyển hướng sẽ thực sự xảy ra.

Tôi sẽ làm điều đầu tiên. Đối với tuyến đường cụ thể đó, một cái gì đó dọc theo những dòng này sẽ làm thủ thuật (không được thử nghiệm).

res.set({ 
    'Cache-Control': 'no-cache, no-store, must-revalidate', 
    'Pragma' : 'no-cache', 
    'Expires' : '0', 
}) 
Các vấn đề liên quan