75

PassportJSでシステムをログアウトするのに問題があります。ログアウトルートが呼び出されているようですが、セッションが削除されていません。ユーザーが特定のルートにログインしていない場合は、401を返すようにします。authenticateUserを呼び出して、ユーザーがログインしているかどうかを確認します。

どうもありがとう!

/******* This in index.js *********/
// setup passport for username & passport authentication
adminToolsSetup.setup(passport);

// admin tool login/logout logic
app.post("/adminTool/login",
    passport.authenticate('local', {
        successRedirect: '/adminTool/index.html',
        failureRedirect: '/',
        failureFlash: false })
);
app.get('/adminTool/logout', adminToolsSetup.authenticateUser, function(req, res){
    console.log("logging out");
    console.log(res.user);
    req.logout();
    res.redirect('/');
});


// ******* This is in adminToolSetup ********
// Setting up user authentication to be using user name and passport as authentication method,
// this function will fetch the user information from the user name, and compare the password     for authentication
exports.setup = function(passport) {
    setupLocalStrategy(passport);
    setupSerialization(passport);
}

function setupLocalStrategy(passport) {
    passport.use(new LocalStrategy(
        function(username, password, done) {
            console.log('validating user login');
            dao.retrieveAdminbyName(username, function(err, user) {
                if (err) { return done(err); }
                if (!user) {
                    return done(null, false, { message: 'Incorrect username.' });
                }
                // has password then compare password
                var hashedPassword = crypto.createHash('md5').update(password).digest("hex");
                if (user.adminPassword != hashedPassword) {
                    console.log('incorrect password');
                    return done(null, false, { message: 'Incorrect password.' });
                }
                console.log('user validated');
                return done(null, user);
            });
        }
    ));
}

function setupSerialization(passport) {
    // serialization
    passport.serializeUser(function(user, done) {
        console.log("serialize user");
        done(null, user.adminId);
    });

    // de-serialization
    passport.deserializeUser(function(id, done) {
        dao.retrieveUserById(id, function(err, user) {
            console.log("de-serialize user");
            done(err, user);
        });
    });
}

// authenticating the user as needed
exports.authenticateUser = function(req, res, next) {
    console.log(req.user);
    if (!req.user) {
        return res.send("401 unauthorized", 401);
    }
    next();
}
4

25 に答える 25

87

ブライスの答えは素晴らしいですが、重要な違いがあることに気付きました。Passport ガイドでは、.logout()(エイリアスとしても.logOut()) を次のように使用することを提案しています。

app.get('/logout', function(req, res){
  req.logout();
  res.redirect('/'); //Can fire before session is destroyed?
});

しかし、前述のように、これは信頼できません。次のようなブライスの提案を実装すると、期待どおりに動作することがわかりました。

app.get('/logout', function (req, res){
  req.session.destroy(function (err) {
    res.redirect('/'); //Inside a callback… bulletproof!
  });
});

お役に立てれば!

于 2013-10-02T08:36:49.860 に答える
43

同じ問題に遭遇しました。req.session.destroy();の代わりに使用しますreq.logout();が、これがベストプラクティスであるかどうかはわかりません。

于 2013-01-11T12:03:22.953 に答える
8

私は同じ問題を抱えていましたが、それは Passport 機能の問題ではなく、自分の/logoutルートを呼び出す方法の問題であることが判明しました。fetch を使用してルートを呼び出しました。

(悪い)

fetch('/auth/logout')
  .then([other stuff]);

それを行うとCookieが送信されないことが判明したため、セッションは継続res.logout()されず、別のセッションに適用されると思いますか? いずれにせよ、次のことを行うと、正しく修正されます。

(良い)

fetch('/auth/logout', { credentials: 'same-origin' })
  .then([other stuff]);
于 2016-09-02T18:39:23.267 に答える
7

私は同じ問題を抱えていました.大文字のOはそれを修正しました;

app.get('/logout', function (req, res){
  req.logOut()  // <-- not req.logout();
  res.redirect('/')
});

編集:これはもはや問題ではありません。

于 2014-11-26T15:07:59.057 に答える
3

答えはどれも私にとって役に立たなかったので、私のものを共有します

app.use(session({
    secret: 'some_secret',
    resave: false,
    saveUninitialized: false,
   cookie: {maxAge: 1000} // this is the key
}))

router.get('/logout', (req, res, next) => {
    req.logOut()
    req.redirect('/')
})
于 2019-02-23T18:18:03.460 に答える
1

自分でセッションを破棄するのは奇妙に見えます。次の構成でこの問題に直面しました:

"express": "^4.12.3",
"passport": "^0.2.1",
"passport-local": "^1.0.0",

この構成はうまく機能していると言わざるを得ません。sessionStore私の問題の理由は、私がここで定義したカスタムにありました:

app.use(expressSession({
    ...
    store: dbSessionStore,
    ...
}));

ここでも問題が発生することを確認するには、ストア行にコメントして、セッションを永続化せずに実行してください。それが機能する場合は、カスタム セッション ストアを掘り下げる必要があります。私の場合、setメソッドの定義が間違っていました。前に思ったように呼び出されないreq.logout()セッションストアメソッドを使用すると。代わりに、更新されたセッションでメソッドをdestroy()呼び出しました。set

この回答がお役に立てば幸いです。

于 2015-04-05T07:38:31.083 に答える
1

パスポートの設定がうまくいかず、うまくいかないことがあるという経験があります。たとえば、私はそうしますvhostが、メインアプリでパスポートをこのように設定しましたが、これは間違っています。

app.js (なぜ間違っているのでしょうか? 以下の blockqoute を参照してください)

require('./modules/middleware.bodyparser')(app);
require('./modules/middleware.passport')(app);
require('./modules/middleware.session')(app);
require('./modules/app.config.default.js')(app, express);

// default router across domain
app.use('/login', require('./controllers/loginController'));
app.get('/logout', function (req, res) {
    req.logout();
    res.redirect('/');
});

// vhost setup
app.use(vhost('sub1.somehost.dev', require('./app.host.sub1.js')));
app.use(vhost('somehost.dev', require('./app.host.main.js')));

本当はログインできないはずなのですが、ミスが続いているのでなんとかログインできています。ここに別のパスポート設定を配置することで、セッションフォームをapp.js利用できるようにしますapp.host.sub1.js

app.host.sub1.js

// default app configuration
require('./modules/middleware.passport')(app);
require('./modules/app.config.default.js')(app, express);

そのため、ログアウトしたいときは... start initialize beforeapp.jsによって何か間違ったことをしたため、うまくいきません。これは間違っています!!.passport.jsexpress-session.js

ただし、他の人が言及しているように、このコードはとにかく問題を解決できます。

app.js

app.get('/logout', function (req, res) {
    req.logout();
    req.session.destroy(function (err) {
        if (err) {
            return next(err);
        }

        // destroy session data
        req.session = null;

        // redirect to homepage
        res.redirect('/');
    });
});

しかし、私の場合、正しい方法は... express-session.jsをpassport.jsの前に入れ替えます

ドキュメントにも言及

ほとんどのアプリケーションで推奨されますが、セッション サポートの有効化は完全にオプションであることに注意してください。有効になっている場合は、passport.session() の前に express.session() を使用して、ログイン セッションが正しい順序で復元されるようにしてください。

それで、私の場合のログアウトの問題を..

app.js

require('./modules/middleware.bodyparser')(app);
require('./modules/middleware.session')(app);
require('./modules/middleware.passport')(app);
require('./modules/app.config.default.js')(app, express);


// default router across domain
app.use('/login', require('./controllers/loginController'));
app.get('/logout', function (req, res) {
    req.logout();
    res.redirect('/');
});

app.host.sub1.js

// default app configuration
require('./modules/app.config.default.js')(app, express);

そして今req.logout();は仕事です。

于 2017-04-15T17:44:35.907 に答える
0

これは私のために働いた:

app.get('/user', restrictRoute, function (req, res) {
  res.header('Cache-Control', 'no-cache, private, no-store, must-revalidate,
              max-stale=0, post-check=0, pre-check=0');
});

ページがキャッシュに保存されないようにします

于 2015-11-17T22:10:28.230 に答える