如何知道用户是否使用 passport.js 登录?

我已经阅读 passport.js的信息和样品两天了,但我不确定之后我做了所有的认证过程。

我如何知道我是否登录,例如,我将有一个带有登录或注销按钮的导航栏,是否有一些变量,如代码下面?

if (login)
<button>logout</button>
else
<button>login</button>
96021 次浏览

如果用户登录,passport.js将在 req中为 express.js中的每个请求创建 user对象,您可以在任何中间件中检查该对象是否存在:

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
});

如果您希望在您的模板中使用它,因为您的代码示例似乎表明您可以创建一些中间件,比如:

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

在您有安装护照之后,将该代码放在某个地方。

然后在模板中使用它(举个例子)

{% if login %}
<button>logout</button>
{% else %}
<button>login</button>
{% endif %}

我正在寻找这样的解决方案,碰到了这个页面。问题是如何检查客户端的登录状态。

登录后,我隐藏了登录按钮,并显示了注销按钮。在页面刷新我再次看到登录按钮,而不是注销按钮。唯一的解决方案是,如果使用 session (如果使用 JWT,则使用 localStorage) ,则将项保存在 sessionStorage 中。注销时删除此项。 然后在每个页面加载中检查这个 sessionStorage 项并执行相应的操作。

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'); };
};

在 app.get ()或 router.get ()中使用以下代码

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


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

它没有明确的文件,但有一个 isAuthenticated()方法是插入到 reqpassport
Can be used as follows,

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'))

问得好,我在尝试实现类似这样的东西时遇到了一些问题,当有一个未经身份验证的请求时,如果 res.local 变量返回一个假值,那么句柄就会跳过 if 块。要解决这个问题,您需要在 app.js 文件中设置一个中间件,使 req.user 在应用程序 Like 中全局可用。.

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}}