পাসপোর্ট.js দিয়ে ব্যবহারকারী লগইন হয়েছে কিনা তা কীভাবে জানবেন?


104

আমি passport.jsদুই দিন ধরে তথ্য এবং নমুনা পড়ছি , তবে আমি নিশ্চিত নই যে এর পরে আমি প্রমাণীকরণের সমস্ত প্রক্রিয়াটি করেছি।

আমি কীভাবে জানব যে আমি লগ ইন করেছি, উদাহরণস্বরূপ, আমার একটি লগইন বা লগআউট বোতাম সহ একটি নেভিগেশন বার থাকবে, নীচে কোডের মতো কিছু ভেরিয়েবল আছে?

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

উত্তর:


210

যদি ব্যবহারকারী লগ ইন থাকে তবে প্রতিটি অনুরোধের জন্য অবজেক্ট passport.jsতৈরি করবে , যা আপনি কোনও মিডলওয়্যারের অস্তিত্বের জন্য যাচাই করতে পারেন:userreqexpress.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
});

এটা কি বিশ্বব্যাপী? আমি লগইন করার পরে সমস্ত প্রকল্পে এটি অ্যাক্সেস করতে পারি?
আরমোনটেস

3
এটি বৈশ্বিক নয় এটি কেবল অনুরোধের বিষয়টিতে।
সুপারনোভা

1
এক্সপ্রেস.জে এবং পাসপোর্ট.জেজেসের সাথে 98.8% ওয়েব বিকাশে আপনি অনুরোধগুলি (অ্যাপ.জেট, অ্যাপ.পস্ট, ইত্যাদি) নিয়ে কাজ করবেন, সুতরাং এর বাইরে পাসপোর্ট.জেএস ব্যবহার করার বিষয়ে কথা বলা কিছুটা অর্থহীন। হ্যাঁ এটা শুধুমাত্র মধ্যে দ্রুতগামী রুট মিডলওয়্যার হ্যান্ডেলার পছন্দ করেন app.get, app.postইত্যাদি আপনি বিভিন্ন কার্যকারিতা প্রয়োজন, তাহলে আপনি সেইসাথে আপনার প্রশ্নে বিস্তারিত ব্যাখ্যা পেশ করবে কি আপনি অর্জন করার চেষ্টা করছেন।
মোক

2
আমি দেখতে পেয়েছি যে যদি আমি "রাউটার.জেট ('/', my_controller.index)" হিসাবে প্রমাণীকরণের জন্য কোনও মিডলওয়্যারের সাথে রাউটার.জেট () সরবরাহ না করি, তবে পাসপোর্টটি কখনই পরামর্শ করা হয় না এবং পুনরায় রেকর্ড করা হয় না q অপরিচ্ছন্ন করা। এটি হতাশার কারণ আমি যে কোনও দর্শনার্থীকে একটি এপিআই কল করার অনুমতি দিতে চাই, তবে কে অনুরোধ করছে তার উপর নির্ভর করে প্রতিক্রিয়াটির বিষয়বস্তুটি তৈরি করুন।
লরেন্স আই সিডেন

2
কেউ কীভাবে ব্যাখ্যা করতে পারে যে এটি কীভাবে কার্যকর নয়? এই চেকটি কেবল অনুরোধে তাদের কোনও ব্যবহারকারী অবজেক্ট কিনা তা দেখতে দেখতে। অধিবেশন বৈধতা কোথায়?
রাম্বোসা

46

যদি আপনি এটি আপনার টেম্পলেটগুলিতে ব্যবহার করতে চান কারণ আপনার কোড নমুনাটি মনে হয় আপনি কিছু মিডলওয়্যার তৈরি করতে পারেন যেমন:

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

আপনার পাসপোর্ট সেটআপ করার পরে কোথাও এই কোডটি রাখুন।

এবং তারপরে এটি আপনার টেমপ্লেটে ব্যবহার করুন (সুইগ উদাহরণ)

{% 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

আমি এই জাতীয় সমাধানটি অনুসন্ধান করছিলাম এবং এই পৃষ্ঠাতে এসে পৌঁছেছি। প্রশ্নটি কীভাবে ক্লায়েন্টের পক্ষে লগইন স্থিতি পরীক্ষা করতে হয়।

লগিংয়ের পরে আমি লগইন বোতামটি লুকিয়ে রাখি এবং লগআউট বোতামটি দেখি। পৃষ্ঠা রিফ্রেশে আমি আবার লগআউট বোতামের পরিবর্তে লগইন বোতামটি দেখতে পাচ্ছি। একমাত্র সমাধানটি হ'ল সেশনস্টোরেজে কোনও আইটেম সংরক্ষণ করা যদি আপনি সেশন ব্যবহার করছেন (এবং লোকালস্টোরেজ যদি আপনি জেডাব্লুটি ব্যবহার করছেন)। লগআউট করার সময় এই আইটেমটি মুছুন। তারপরে প্রতিটি পৃষ্ঠায় লোড করুন এই সেশন স্টোরেজ আইটেমটি এবং এটি অনুসারে করুন।

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('/edit/:id', (req, res)=>{
  if(req.isAuthenticated()){
     if(req.isAuthenticated()){
      //

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

0

ভাল প্রশ্ন, এই জাতীয় কিছু বাস্তবায়নের চেষ্টা করার সময় আমার কিছু সমস্যা ছিল, যখন কোনও অ-অনুমোদনপ্রাপ্ত অনুরোধ থাকে হ্যান্ডেলবারগুলি যদি ব্লকটি এড়িয়ে যায় যদি রেস.লোকালস ভেরিয়েবল একটি মিথ্যা মান দেয়। এই সমস্যাটি সমাধান করার জন্য আপনার অ্যাপ্লিকেশনটিতে 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.