gpt4 book ai didi

Node.Js + express + Passport : Can't logout user

转载 作者:搜寻专家 更新时间:2023-10-31 22:22:15 24 4
gpt4 key购买 nike

我为网络服务器编写了一个 JS 脚本,其中包括使用 Passport 和摘要策略进行身份验证。我没有使用 session ,但我尝试使用 session 并且它不会改变结果。浏览器请求“/login”路由并显示内置登录对话框。身份验证工作正常,但我无法让用户“注销”。问题似乎是浏览器会记住登录凭据并自动重新发送它们。最终结果是用户必须完全关闭浏览器才能注销,但这对这个应用程序来说是个问题。我知道肯定有办法告诉浏览器不要这样做,但我还没想出来。

我想出了一个让浏览器再次显示登录对话框的技巧;强制身份验证函数返回 false。但是,我还没有想出一种方法来在每次 session 中执行此操作。现在,如果一个人退出,那么所有人都会退出。这不是一个可行的解决方案。

谁能告诉我我做错了什么?我想知道的一件事是,当浏览器发送到/logout 路由时,我是否向浏览器返回了正确的响应(请参阅结尾)。我返回 res.json(""),但也许我应该发送不同的响应来告诉浏览器忘记 session 的凭据?

我的代码如下。非常感谢任何见解。提前谢谢你。

T

var passport = require('passport'), 
DigestStrategy = require('passport-http').DigestStrategy;

var express = require('express');
var app = express();
app.configure(function () {
app.use(
"/", //the URL throught which you want to access to you static content
express.static('./www') //where your static content is located in your filesystem
);
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(express.session({ secret: 'keep moving forward' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);


});
app.listen(80); //the port you want to use


/**
* CORS support.
*/

app.all('*', function(req, res, next){
if (!req.get('Origin')) return next();
// use "*" here to accept any origin
// For specific domain, do similar: http://localhost'
// Use an array for multiple domains, like [http://localhost', 'http://example.com' ]
res.set('Access-Control-Allow-Origin', '*' );
res.set('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.set('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Authorization');
next();
});


//
// Configure passport authentication
//


// Used to force the browser to display the login screen again.
var forceLogin = false;
passport.use(new DigestStrategy({ qop: 'auth' },
function(username, done ) {

if ( !forceLogin )
{
return done(null, username, "nimda");
}
else
{
//
// Forces the browser to request the user name again by returning a failure to its last request.
//
console.log ( "forcing user to log in" );
forceLogin = false;
return done(null, false);
}
));

passport.serializeUser(function(user, done) {

console.log( "serialize user " + user.toString() );
done(null, user.toString());
});

passport.deserializeUser(function(id, done) {
console.log( "deserialize user " + id.toString() );
done(null, id);
});

app.post('/login', passport.authenticate('digest', { session: true }),
function(req, res) {
console.log( "/login");
res.header('Cache-Control', 'no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0');
res.json({ id: req.user.id, username: req.user.username });
});

app.post('/logout', function(req, res){

req.logOut();

// NOTE: Same results as req.logout
//
// req.session.destroy(function (err) {
// res.redirect('/');
// });

res.redirect("/");

// flag to force a login
forceLogin = true;

console.log( "logout");

// Is this the proper return to the browser?
return res.json("");
});

最佳答案

你可以试试下面的方法

req.session.destroy()
req.logout()
res.redirect('/')

如果您使用某种形式的 session 存储来保存 session (例如 Redis),那么保存 session 的新状态很重要。我用类似的设置尝试了上面的代码,它似乎对我有用

关于Node.Js + express + Passport : Can't logout user,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20547841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com