จะทราบได้อย่างไรว่าผู้ใช้ล็อกอินด้วย passport.js?


104

ฉันอ่านpassport.jsข้อมูลและตัวอย่างมาสองวันแล้ว แต่ไม่แน่ใจว่าหลังจากนั้นฉันก็ทำตามขั้นตอนการพิสูจน์ตัวตนทั้งหมด

ฉันจะรู้ได้อย่างไรว่าฉันเข้าสู่ระบบแล้วเช่นฉันจะมีแถบนำทางที่มีปุ่มล็อกอินหรือออกจากระบบมีตัวแปรบางอย่างเช่นโค้ดด้านล่างนี้หรือไม่?

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

คำตอบ:


210

หากผู้ใช้เข้าสู่ระบบpassport.jsจะสร้างuserออบเจ็กต์reqสำหรับทุกคำขอในexpress.jsซึ่งคุณสามารถตรวจสอบการมีอยู่ในมิดเดิลแวร์ใดก็ได้:

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

คุณสามารถสร้างexpress.jsมิดเดิลแวร์อย่างง่ายสำหรับสิ่งนั้นซึ่งจะตรวจสอบว่าผู้ใช้เข้าสู่ระบบหรือไม่และหากไม่ - จะเปลี่ยนเส้นทางไปที่/loginหน้า:

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

และใช้มัน:

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

เป็นสากล? ฉันสามารถเข้าถึงได้ในทุกโปรเจ็กต์หลังจากเข้าสู่ระบบหรือไม่?
RMontes13

3
มันไม่ใช่ทั่วโลก แต่อยู่ในวัตถุที่ร้องขอ
supernova

1
ใน 98.8% ของการพัฒนาเว็บด้วย express.js และ passport.js คุณจะต้องจัดการกับคำขอ (app.get, app.post ฯลฯ ) ดังนั้นการพูดถึงการใช้ passport.js นอกนั้นจึงไม่มีจุดหมายเล็กน้อย ใช่มันเป็นเฉพาะภายในด่วนไสเส้นทางมิดเดิลแวร์ชอบapp.get, app.postฯลฯ ถ้าคุณต้องการการทำงานที่แตกต่างกันแล้วคุณควรจะอธิบายในรายละเอียดในคำถามของคุณเช่นเดียวกับสิ่งที่คุณกำลังพยายามที่จะบรรลุ
moka

2
ฉันพบว่าถ้าฉันไม่ได้ให้ router.get () กับมิดเดิลแวร์ใด ๆ เพื่อตรวจสอบการพิสูจน์ตัวตนเช่นเดียวกับใน "router.get ('/', my_controller.index)" จะไม่มีการปรึกษาหนังสือเดินทางและผู้ใช้จะต้องขอใหม่เสมอ ไม่ได้กำหนด สิ่งนี้น่าหงุดหงิดเพราะฉันต้องการอนุญาตให้ผู้เข้าชมทุกคนเรียกใช้ API แต่ปรับแต่งเนื้อหาของการตอบกลับโดยขึ้นอยู่กับผู้ที่ร้องขอ
Lawrence I. Siden

2
ใครช่วยอธิบายวิธีนี้ไม่ให้เกิดประโยชน์ได้? การตรวจสอบนั้นเพียงแค่ดูว่าเป็นวัตถุของผู้ใช้ในคำขอหรือไม่ การตรวจสอบเซสชันอยู่ที่ไหน
rambossa

46

หากคุณต้องการใช้ในเทมเพลตของคุณเนื่องจากตัวอย่างโค้ดของคุณดูเหมือนจะระบุว่าคุณสามารถสร้างมิดเดิลแวร์ได้เช่นนี้:

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

วางรหัสนั้นไว้ที่ใดที่หนึ่งหลังจากที่คุณตั้งค่าหนังสือเดินทางแล้ว

จากนั้นใช้ในเทมเพลตของคุณ (ตัวอย่าง swig)

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

ด้วยเหตุผลบางประการมิดเดิลแวร์ข้างต้นทำให้ฉันมีปัญหากับผู้ใช้ที่ไม่ได้ระบุในเทมเพลตของฉัน ฉันต้องจัดหาวัตถุผู้ใช้ใหม่ให้กับมุมมองเพื่อแก้ไข: app.use(function(req,res,next){ res.locals.login = req.isAuthenticated(); res.locals.user = req.user; next(); });
Tebbers

1
แม้ว่าจะตรวจสอบสิทธิ์สำเร็จแล้ว แต่ก็isAuthenticatedให้ข้อมูลเท็จในคำขอถัดไป คุณช่วยตอบคำถามนี้ได้ไหมstackoverflow.com/questions/42842171/…
Suhail Gupta

3

มันไม่ได้มีการบันทึกไว้อย่างชัดเจน แต่มีisAuthenticated()วิธีการที่จะถูกแทรกเข้าไปreqโดยหนังสือเดินทาง
สามารถใช้งานได้ดังนี้

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

ฉันกำลังค้นหาวิธีแก้ปัญหาดังกล่าวและเจอหน้านี้ คำถามคือวิธีตรวจสอบสถานะการเข้าสู่ระบบในฝั่งไคลเอนต์

หลังจากเข้าสู่ระบบฉันซ่อนปุ่มเข้าสู่ระบบและแสดงปุ่มออกจากระบบ ในการรีเฟรชหน้าฉันเห็นปุ่มล็อกอินอีกครั้งแทนที่จะเป็นปุ่มออกจากระบบ ทางออกเดียวคือบันทึกรายการใน sessionStorage หากคุณกำลังใช้เซสชัน (และ localStorage ถ้าคุณใช้ JWT) ลบรายการนี้เมื่อคุณออกจากระบบ จากนั้นในการโหลดทุกหน้าให้ตรวจสอบรายการ sessionStorage นี้และทำตามนั้น

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

ใช้โค้ดด้านล่างภายใน app.get () หรือ router.get ()

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

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

0

เป็นคำถามที่ดีฉันมีปัญหาบางอย่างในขณะที่พยายามใช้สิ่งนี้เมื่อมีคำขอที่ไม่ได้รับการตรวจสอบความถูกต้องแฮนด์บาร์จะข้ามบล็อก if หากตัวแปร res.locals ส่งคืนค่าที่เป็นเท็จ ในการแก้ปัญหานี้คุณต้องตั้งค่ามิดเดิลแวร์ในไฟล์ app.js ของคุณเพื่อให้ req.user พร้อมใช้งานทั่วโลกในแอพของคุณเช่นนั้น ..

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

});

ในไฟล์ส่วนหัวของคุณคุณสามารถตรวจสอบผู้ใช้ที่ได้รับการรับรองความถูกต้องและแสดงตามเนื้อหาดังนี้ ..

                {{#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}} 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.