कैसे पता करें कि उपयोगकर्ता पासपोर्ट.जेएस के साथ लॉग इन है?


104

मैं passport.jsदो दिनों के लिए जानकारी और नमूने पढ़ रहा हूं, लेकिन मुझे यकीन नहीं है कि इसके बाद मैंने प्रमाणीकरण की सारी प्रक्रिया की।

मुझे कैसे पता चलेगा कि मैं लॉग इन हूं, उदाहरण के लिए, मेरे पास एक लॉगिन या लॉगआउट बटन के साथ एक नेविगेशन बार होगा, क्या नीचे दिए गए कोड की तरह कुछ चर है?

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

जवाबों:


210

यदि उपयोगकर्ता लॉग इन है, passport.jsतो प्रत्येक अनुरोध के लिए userऑब्जेक्ट बनाएगा , जिसे आप किसी भी मिडलवेयर में अस्तित्व के लिए जाँच सकते हैं:reqexpress.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
यह अनुरोध वस्तु पर वैश्विक नहीं है।
सुपरनोवा

1
एक्सप्रेस.जेएस और पासपोर्ट.जेएस के साथ 98.8% वेब विकास में आप अनुरोधों (app.get, app.post, आदि) से निपटेंगे, इसलिए इसके बाहर पासपोर्ट.जेएस का उपयोग करने के बारे में बात करना थोड़ा व्यर्थ है। हाँ, यह एक्सप्रेस रूट मिडलवेयर हैंडलर जैसे भीतर है app.get, app.postआदि। यदि आपको अलग-अलग कार्यक्षमता की आवश्यकता है, तो आपको इसे अपने प्रश्न में विवरणों के साथ-साथ जो आप प्राप्त करने की कोशिश कर रहे हैं, उसे समझाना चाहिए।
मोका

2
मैंने पाया कि अगर मैं प्रमाणीकरण के लिए जाँच करने के लिए किसी भी मिडलवेयर के साथ राउटर। अपरिभाषित होना। यह निराशाजनक है क्योंकि मैं किसी भी आगंतुक को एपीआई कॉल करने की अनुमति देना चाहता हूं, लेकिन जो अनुरोध कर रहा है उसके आधार पर प्रतिक्रिया की सामग्री को दर्जी करें।
लॉरेंस आई। सिडेन

2
क्या कोई समझा सकता है कि यह शोषक नहीं है? यह जांच केवल यह देखने के लिए की जाती है कि क्या अनुरोध में उनका उपयोगकर्ता ऑब्जेक्ट है। सत्र सत्यापन कहां है?
रामबोसा

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(); });
टेबर्स

सफल प्रमाणीकरण के बाद भी, isAuthenticatedअगले अनुरोध में गलत देता है। क्या आप इस सवाल का जवाब देने में मदद कर सकते हैं stackoverflow.com/questions/42842171/…
सुहैल गुप्ता

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

मैं ऐसे समाधान खोज रहा था और इस पृष्ठ पर आया। सवाल यह है कि क्लाइंट साइड पर लॉगिन स्थिति कैसे जांचें।

लॉग इन करने के बाद मैं लॉगिन बटन छिपाता हूं और लॉगआउट बटन दिखाता हूं। पेज रिफ्रेश पर मैं फिर से लॉगआउट बटन के बजाय लॉगिन बटन देखता हूं। यदि आप सत्र का उपयोग कर रहे हैं, और सत्र में (और यदि आप JWT का उपयोग कर रहे हैं, तो लोकलस्टोरेज का उपयोग कर रहे हैं)। लॉगआउट होने पर इस आइटम को हटा दें। फिर हर पेज लोड में इस सेशनस्टोर आइटम को चेक करें और उसके अनुसार करें।

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

एप्लिकेशन के अंदर कोड का उपयोग करें। () या राऊटर.गेट ()

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

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

0

अच्छा सवाल है, मैं कुछ मुद्दों को इस तरह से लागू करने की कोशिश कर रहा था, जब वहाँ एक गैर-प्रमाणित अनुरोध है, तो हैंडलबार अगर ब्लॉक को रोक देता है, तो res.locals चर एक गलत मान देता है। इस समस्या को हल करने के लिए आपको अपने ऐप में एक मिडलवेयर सेटअप करना होगा। अपने ऐप में 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}} 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.