我已经阅读了两天的 passport.js
信息和示例,但我不确定在那之后我是否完成了所有的认证过程。
例如,如何知道我是否已登录,例如,我将具有带有登录或注销按钮的导航栏,是否有一些类似下面代码的变量?
if (login)
<button>logout</button>
else
<button>login</button>
我已经阅读了两天的 passport.js
信息和示例,但我不确定在那之后我是否完成了所有的认证过程。
例如,如何知道我是否已登录,例如,我将具有带有登录或注销按钮的导航栏,是否有一些类似下面代码的变量?
if (login)
<button>logout</button>
else
<button>login</button>
passport.js
会在每个请求中为 express.js
创建一个 user
对象,并将其存储在 req
中,您可以在任何中间件中检查其是否存在。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();
});
在设置好护照(passport)之后,将该代码放置在某个位置。
然后在您的模板中使用它(swig示例)。
{% 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();`
`});`
- TebbersisAuthenticated
为false。您能帮忙回答这个问题吗?http://stackoverflow.com/questions/42842171/detect-if-the-user-was-authenticated-before - Suhail Gupta虽然没有明确文档,但是passport会将一个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'))
我在搜索解决方案时发现了这个页面。问题是如何在客户端检查登录状态。
登录后,我隐藏了登录按钮并显示了注销按钮。在页面刷新后,我再次看到登录按钮而不是注销按钮。唯一的解决方法是在使用会话时保存一个项目在sessionStorage中(如果您使用JWT,则保存在localStorage中)。在注销时删除此项目。 然后在每个页面加载时检查此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'); };
};
router.get('/edit/:id', (req, res)=>{
if(req.isAuthenticated()){
if(req.isAuthenticated()){
//
}
else{
res.redirect('/users/login');//your particular login routes
}
});
好问题,我在尝试实现类似功能时遇到了一些问题,当存在未经身份验证的请求时,如果res.locals变量返回一个falsy值,handlebars会跳过if块。为了解决这个问题,您需要在app.js文件中设置一个中间件,使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}}
app.get
、app.post
等)中使用。如果您需要不同的功能,则应在问题中详细说明以及您试图实现什么。 - mokareq.user
。所有请求数据都在诸如req.body
、req.query
和req.params
之类的子对象中。除非中间件受到破坏,否则请求无法直接设置用户,而此时您已经失去了控制权。 - anon