답변:
사용자가 로그인 한 경우 passport.js
는의 모든 요청에 대해 user
객체를 생성 하여 미들웨어에 존재하는지 확인할 수 있습니다.req
express.js
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.get
,, app.post
등과 같은 익스프레스 라우트 미들웨어 핸들러에서만 가능합니다 . 다른 기능이 필요한 경우 질문에 자세히 설명하고 달성하려는 작업에 대해 설명해야합니다.
코드 샘플이 다음과 같은 미들웨어를 만들 수 있음을 나타내는 것처럼 템플릿에서 사용하려면 다음과 같이하십시오.
app.use(function (req, res, next) {
res.locals.login = req.isAuthenticated();
next();
});
여권을 설정 한 후 해당 코드를 어딘가에 넣으십시오.
그런 다음 템플릿에서 사용 (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();
});
isAuthenticated
다음 요청에서 false를 제공합니다. 이 질문에 답 수 stackoverflow.com/questions/42842171/...
명시 적으로 설명되어 있지 않지만 거기 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'))
나는 그러한 해결책을 찾고 있었고이 페이지를 발견했습니다. 질문은 클라이언트 측에서 로그인 상태를 확인하는 방법입니다.
로그인 후 로그인 버튼을 숨기고 로그 아웃 버튼을 표시합니다. 페이지 새로 고침에서 로그 아웃 버튼 대신 로그인 버튼이 다시 표시됩니다. 유일한 해결책은 session을 사용하는 경우 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'); };
};
좋은 질문입니다. 인증되지 않은 요청이있을 때 res.locals 변수가 잘못된 값을 반환하는 경우 핸들 바가 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}}