사용자가 passport.js로 로그인했는지 어떻게 알 수 있습니까?


104

passport.js이틀 동안 정보와 샘플을 읽었 지만 그 이후로 모든 인증 프로세스를 수행했는지 확실하지 않습니다.

로그인 여부를 어떻게 알 수 있습니까? 예를 들어 로그인 또는 로그 아웃 버튼이있는 내비게이션 바가 있습니다. 아래 코드와 같은 변수가 있습니까?

if (login)
   <button>logout</button>
else 
   <button>login</button>

답변:


210

사용자가 로그인 한 경우 passport.js는의 모든 요청에 ​​대해 user객체를 생성 하여 미들웨어에 존재하는지 확인할 수 있습니다.reqexpress.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
});

글로벌? 로그인 후 모든 프로젝트에서 액세스 할 수 있습니까?
RMontes13 2013 년

3
전역 적이 지 않고 요청 객체에만 있습니다.
초신성

1
express.js 및 passport.js를 사용한 웹 개발의 98.8 %에서는 요청 (app.get, app.post 등)을 처리하게되므로 외부에서 passport.js를 사용하는 것에 대해 이야기하는 것은 약간 무의미합니다. 예 app.get,, app.post등과 같은 익스프레스 라우트 미들웨어 핸들러에서만 가능합니다 . 다른 기능이 필요한 경우 질문에 자세히 설명하고 달성하려는 작업에 대해 설명해야합니다.
moka 2013 년

2
"router.get ( '/', my_controller.index)"에서와 같이 인증을 확인하기 위해 미들웨어와 함께 router.get ()을 제공하지 않으면 여권이 참조되지 않으며 req.user는 항상 정의되지 않습니다. 모든 방문자가 API를 호출 할 수 있도록 허용하지만 요청하는 사람에 따라 응답 내용을 조정하기 때문에 답답합니다.
Lawrence I. Siden 2014

2
누군가 이것이 어떻게 악용되지 않는지 설명 할 수 있습니까? 이 검사는 단순히 요청의 사용자 개체인지 확인합니다. 세션 유효성 검사는 어디에 있습니까?
rambossa

46

코드 샘플이 다음과 같은 미들웨어를 만들 수 있음을 나타내는 것처럼 템플릿에서 사용하려면 다음과 같이하십시오.

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

인증이 성공한 후에도 isAuthenticated다음 요청에서 false를 제공합니다. 이 질문에 답 수 stackoverflow.com/questions/42842171/...
하일 굽타

3

명시 적으로 설명되어 있지 않지만 거기 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'))

2

나는 그러한 해결책을 찾고 있었고이 페이지를 발견했습니다. 질문은 클라이언트 측에서 로그인 상태를 확인하는 방법입니다.

로그인 후 로그인 버튼을 숨기고 로그 아웃 버튼을 표시합니다. 페이지 새로 고침에서 로그 아웃 버튼 대신 로그인 버튼이 다시 표시됩니다. 유일한 해결책은 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'); };
}; 

2

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

0

좋은 질문입니다. 인증되지 않은 요청이있을 때 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}} 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.