পাসপোর্ট.js ব্যবহার করে নোড.জেজে প্রমাণীকরণের পরে পূর্ববর্তী পৃষ্ঠায় পুনর্নির্দেশ


103

আমি নোড.জেএস, এক্সপ্রেস এবং পাসপোর্ট.জেএস ব্যবহার করে লগইন প্রক্রিয়া প্রতিষ্ঠার চেষ্টা করছি। লগইন নিজেই বেশ সুন্দর কাজ করে, সেশনগুলিও রেডিসের সাথে খুব ভালভাবে সংরক্ষণ করা হয় তবে ব্যবহারকারীর পুনর্নির্দেশের সাথে আমার কোনও সমস্যা হয় যেখানে তিনি প্রমাণীকরণের অনুরোধ জানাতে আগে থেকেই শুরু করেছিলেন।

উদাহরণস্বরূপ ব্যবহারকারীর লিঙ্কটি http://localhost:3000/hiddenএরপরে পুনঃনির্দেশিত হয় http://localhost:3000/loginতবে আমি তাকে আবার পুনঃনির্দেশিত করতে চাই http://localhost:3000/hidden

এর উদ্দেশ্য হ'ল, ব্যবহারকারী যদি প্রথমে এলোমেলোভাবে কোনও পৃষ্ঠায় লগইন করার প্রয়োজন হয় তবে তাকে তার শংসাপত্রগুলি সরবরাহ করে / লগইন সাইটটিতে পুনঃনির্দেশিত করা হবে এবং তারপরে তিনি পূর্বে অ্যাক্সেস করার চেষ্টা করেছিলেন এমন সাইটটিতে পুনঃনির্দেশিত করা হবে।

এখানে আমার লগইন পোস্ট

app.post('/login', function (req, res, next) {
    passport.authenticate('local', function (err, user, info) {
        if (err) {
            return next(err)
        } else if (!user) { 
            console.log('message: ' + info.message);
            return res.redirect('/login') 
        } else {
            req.logIn(user, function (err) {
                if (err) {
                    return next(err);
                }
                return next(); // <-? Is this line right?
            });
        }
    })(req, res, next);
});

এবং এখানে আমার নিশ্চিত প্রমাণিত পদ্ধতি od

function ensureAuthenticated (req, res, next) {
  if (req.isAuthenticated()) { 
      return next();
  }
  res.redirect('/login');
}

যা /hiddenপৃষ্ঠাতে হুক করে

app.get('/hidden', ensureAuthenticated, function(req, res){
    res.render('hidden', { title: 'hidden page' });
});

লগইন সাইটের জন্য এইচটিএমএল আউটপুটটি বেশ সহজ

<form method="post" action="/login">

  <div id="username">
    <label>Username:</label>
    <input type="text" value="bob" name="username">
  </div>

  <div id="password">
    <label>Password:</label>
    <input type="password" value="secret" name="password">
  </div>

  <div id="info"></div>
    <div id="submit">
    <input type="submit" value="submit">
  </div>

</form>

হাই, আমি একই পার্থক্যটি কেবল তখনই করছি যখন ব্যবহারকারীর সফলভাবে লগ ইন করা হয় তবে আমি স্বাগত html পৃষ্ঠায় 'ওয়েলকাম ইউজারনেম' এর মত বার্তা দিয়ে পুনঃনির্দেশ করব। ব্যবহারকারী নাম তার লগইননাম হবে শুনুন। আপনি কী আমাকে পরবর্তী পৃষ্ঠায় পাঠ্য বাক্সের মানটি পাস করতে পারবেন তা ??
ধ্রুমিল শাহ

আমি খুব সহজেই এর মধ্য দিয়ে যাব বলে খুব বেশি কিছু জানি না। আমার উদাহরণ অনুসারে যা হতে পারে: রেজ.রেন্ডার ('লুকানো', {শিরোনাম: 'লুকানো পৃষ্ঠা', ব্যবহারকারীর নাম: 'টায়রিওন ল্যানিস্টার'});
অ্যালেক্স

উত্তর:


86

আমি পাসপোর্ট সম্পর্কে জানি না, তবে আমি এটি কীভাবে করব তা এখানে:

আমার একটি মিডলওয়্যার রয়েছে যা আমি app.get('/account', auth.restrict, routes.account)সেটের সাথে সেটের সাথে ব্যবহার করি redirectTo... তারপরে আমি লগইন / এ পুনঃনির্দেশ করি

auth.restrict = function(req, res, next){
    if (!req.session.userid) {
        req.session.redirectTo = '/account';
        res.redirect('/login');
    } else {
        next();
    }
};

তারপরে routes.login.postআমি নিম্নলিখিতগুলি করি:

var redirectTo = req.session.redirectTo || '/';
delete req.session.redirectTo;
// is authenticated ?
res.redirect(redirectTo);

আপনার উত্তর দেওয়ার জন্য ধন্যবাদ. আপনি কি আপনার কোডটিতে পুনঃনির্দেশ / অ্যাকাউন্টটি সেট করছেন না? আপনার যদি অন্য কোনও লিঙ্ক থাকে তবে চলুন একই প্রবন্ধটি ব্যবহার করে বলুন / প্রো_এক অ্যাকাউন্টগুলি rict তাদের অ্যাকাউন্ট / অ্যাকাউন্টে পুনঃনির্দেশ করা হবে সীমাবদ্ধ করুন ....
অ্যালেক্স

4
সেটা সত্য. তারা লগইন করার পরে আমি সর্বদা / অ্যাকাউন্টে পুনঃনির্দেশ করি তবে আপনি এটিকে প্রতিস্থাপন করতে পারেনreq.session.redirect_to = req.path
chovy

4
এইচএম .. এটি বেশিরভাগ ক্ষেত্রেই আমি খুঁজছি না। আমি ব্যবহারকারীকে ইতিমধ্যে শৃঙ্খলাবদ্ধ কিনা, তা লগইন / লগইনে ডাইরেক্টর করা হয়েছে কিনা তা নির্ধারণের জন্য আমি অ্যান্টিফিকেশনকে ফোন করি। এই দর্শন থেকে আমার / অ্যাকাউন্টে ফিরে যাওয়ার কোনও উপায় প্রয়োজন। লগইন মধ্যে req.path কল আমাকে সহজ / লগইন ফিরে দেয়। ব্রাউজারটি রেফারারকে যথাযথভাবে সেট করে দিলে রেফারার ব্যবহার করা কোনওভাবেই কাজ করে না প্লাস এটি যথেষ্ট নির্দিষ্ট নয় ...
অ্যালেক্স

6
req.session.redirect_to = req.pathআপনার লেখক মিডলওয়্যারের ভিতরে আপনাকে সেট করতে হবে । তারপরে এটি পড়ুন এবং এটি login.postরুটে মুছুন ।
chovy

এটি পাসপোর্টের জন্য দুর্দান্ত সমাধান নয় যা সাফল্য গ্রহণ করে
পুনর্নির্দেশ করুন

115

আপনার ensureAuthenticatedপদ্ধতিতে এইভাবে সেশনটিতে রিটার্ন url সংরক্ষণ করুন:

...
req.session.returnTo = req.originalUrl; 
res.redirect('/login');
...

তারপরে আপনি নিজের পাসপোর্ট আপডেট করতে পারেন utআপনিমা রুট জাতীয় কিছুতে:

app.get('/auth/google/return', passport.authenticate('google'), function(req, res) {
    res.redirect(req.session.returnTo || '/');
    delete req.session.returnTo;
}); 

7
প্রথম পাসে কাজ করেছেন, তবে আমাকে পাসপোর্টে পুনর্নির্দেশের পরে নিম্নলিখিতগুলি যুক্ত করা দরকার ut পরবর্তী লগআউট / লগইন করার পরে ফেরতের ঠিকানাতে ফিরে যাওয়া এড়াতে সত্যিকারের রুটটি: পাসপোর্টের ডিফল্ট লগআউট সম্পর্কে অতিরিক্ত তথ্যের জন্য এই প্রশ্নটিreq.session.returnTo = null; দেখুন , যা, উত্স পরীক্ষায়, কেবল সেশন.ইউজারকে সাফ করে দেখাবে, এবং পুরো সেশনটি নয়।
রব অ্যান্ডরেন

আমি কি সেশনের পরিবর্তে কলব্যাক = / প্রোফাইলের মতো কোনও ক্যোয়ারির চারপাশে যেতে পারি
ওএমজিপিওপি

@ এমজিপিওপ আপনি সম্ভবত পারেন, তবে এটি খুব সুরক্ষিত মনে হচ্ছে না, এমন কোনও কারণ আছে যা আপনি সেশনের সুবিধা নিতে চান না?
লিনাক্সদান

@ লিনাক্সডান মোটেও না তবে পুনঃনির্দেশ লিঙ্কটি বের করে সেশনে স্থাপন করা কেবল সমস্যাজনক, তারপরে ব্যবহারকারী যখন পুনঃনির্দেশিত হয়, সেশন থেকে পুনর্নির্দেশের লিঙ্কটি পুনরায় বরাদ্দ করুন
ওএমজিপিওপি

5
পরিবর্তে req.pathআমি ব্যবহার করতে হবেreq.originalUrl এটির যেহেতু এটি বেসরাল এবং পথের সংমিশ্রণ হিসাবে , ডকুমেন্টেশন দেখুন
ম্যাথিউইস


7

আমার কাজ করার পদ্ধতি:

const isAuthenticated = (req, res, next) => {
  if (req.isAuthenticated()) {
    return next()
  }
  res.redirect( `/login?origin=${req.originalUrl}` )
};

জিইটি / লগইন নিয়ামক:

if( req.query.origin )
  req.session.returnTo = req.query.origin
else
  req.session.returnTo = req.header('Referer')

res.render('account/login')

পোস্ট / লগইন নিয়ামক:

  let returnTo = '/'
  if (req.session.returnTo) {
    returnTo = req.session.returnTo
    delete req.session.returnTo
  }

  res.redirect(returnTo);

পোস্ট / লগআউট নিয়ন্ত্রক (100% ঠিক আছে কিনা তা নিশ্চিত নয়, মন্তব্যগুলি স্বাগত):

req.logout();
res.redirect(req.header('Referer') || '/');
if (req.session.returnTo) {
  delete req.session.returnTo
}

রিটার্নটল মিডলওয়্যার সাফ করুন (প্রমাণীকরণের পথ ব্যতীত যে কোনও রুটে সেশন থেকে রিটার্নটি সাফ করুন - আমার জন্য তারা / লগইন এবং / লেখক / সরবরাহকারী):

String.prototype.startsWith = function(needle)
{
  return(this.indexOf(needle) == 0)
}

app.use(function(req, res, next) {
  if ( !(req.path == '/login' || req.path.startsWith('/auth/')) && req.session.returnTo) {
    delete req.session.returnTo
  }
  next()
})

এই পদ্ধতির দুটি বৈশিষ্ট্য রয়েছে :

  • আপনি কিছু অনুমোদনপ্রাপ্ত সঙ্গে রুট রক্ষা করতে পারেন ;
  • যে কোনও পৃষ্ঠায় আপনি লগইন ইউআরএল ক্লিক করতে পারেন, এবং লগইন পরে সেই পৃষ্ঠাতে ফিরে আসতে পারেন;

এখানে অনেক ভাল প্রতিক্রিয়া ছিল, আমি আপনার উদাহরণটি ব্যবহার করতে সক্ষম হয়েছি এবং এটি আমার প্রকল্পের সাথে কাজ করেছিলাম। ধন্যবাদ!
ব্যবহারকারী 752746

5

আপনি যদি সংযোগ-নিশ্চিত-লগইন ব্যবহার করেন তবে successReturnToOrRedirectপ্যারামিটারটি ব্যবহার করে পাসপোর্টের সাথে এটি করার জন্য একটি অতি-সহজ, সংহত উপায় রয়েছে । ব্যবহার করা হলে, পাসপোর্ট আপনাকে মূলত অনুরোধ করা URL বা আপনার সরবরাহ করা URL- এ ফ্যালব্যাক প্রেরণ করবে।

router.post('/login', passport.authenticate('local', {
  successReturnToOrRedirect: '/user/me',
  failureRedirect: '/user/login',
  failureFlash: true
}));

https://github.com/jaredhanson/connect-ensure-login#log-in-and-return-to


এটি @ জারেদেনসনের উত্তরের ডুপ্লিকেটের মতো বলে মনে হচ্ছে
মাইম্যাকচ্যাকনা

1

@chovy এবং @linuxdan উত্তর আছে বাগ ক্লিয়ারিং না সঙ্গে session.returnToব্যবহারকারী সেখানে মাধ্যমে এবং লগইন পুনর্নির্দেশ পরে অন্য পৃষ্ঠাতে যান (না না প্রমাণীকরণ প্রয়োজন হয় না) লগইন গেলে। সুতরাং তাদের প্রয়োগে এই কোড যুক্ত করুন:

// clear session.returnTo if user goes to another page after redirect to login
app.use(function(req, res, next) {
    if (req.path != '/login' && req.session.returnTo) {
        delete req.session.returnTo
    }
    next()
})

আপনি যদি লগইন পৃষ্ঠা থেকে কিছু এজ্যাক্স অনুরোধ করেন তবে আপনি সেগুলিও বাদ দিতে পারেন।


আরেকটি পন্থা হ'ল ফ্ল্যাশ ব্যবহার করাensureAuthenticated

req.flash('redirectTo', req.path)
res.redirect('/login')

এবং তারপরে জিইটি লগইন করুন

res.render('login', { redirectTo: req.flash('redirectTo') })

লগইন ফর্মে দেখার জন্য লুকানো ক্ষেত্র যুক্ত করুন (উদাহরণস্বরূপ জেড)

if (redirectTo != '')
    input(type="hidden" name="redirectTo" value="#{redirectTo}")

পোস্ট লগইন

res.redirect(req.body.redirectTo || '/')

লক্ষ্য করুন যে redirectTo এর সাথে প্রথম জিইটি লগইন করার পরে পরিষ্কার হয়ে যাবে।


0

এটি অর্জনের সহজতম (এবং সঠিকভাবে) উপায় হ'ল সেটিংস failureRedirectএবং successRedirectবিকল্পগুলি


তুমি কি বিস্তারিত বলতে পারো? আমি দেখতে পাচ্ছি successRedirectফিরতি রুটে ব্যবহৃত হচ্ছে, তবে তারপরে লক্ষ্যযুক্ত গন্তব্যটি (যেমন returnToউপরে) হারিয়ে যাবে, তাই না?
টম স্যাডারলুন্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.