passport.js passport.initialize () 미들웨어가 사용되지 않음


103

나는 express + mongoose와 함께 node를 사용하고 있고 편안한 API로 passport.js를 사용하려고합니다.
인증 성공 후에도이 예외가 계속 발생합니다 (브라우저에 콜백 URL이 표시됨).

/Users/naorye/dev/naorye/myproj/node_modules/mongoose/lib/utils.js:419
        throw err;
              ^
Error: passport.initialize() middleware not in use
    at IncomingMessage.req.login.req.logIn (/Users/naorye/dev/naorye/myproj/node_modules/passport/lib/passport/http/request.js:30:30)
    at Context.module.exports.delegate.success (/Users/naorye/dev/naorye/myproj/node_modules/passport/lib/passport/middleware/authenticate.js:194:13)
    at Context.actions.success (/Users/naorye/dev/naorye/myproj/node_modules/passport/lib/passport/context/http/actions.js:21:25)
    at verified (/Users/naorye/dev/naorye/myproj/node_modules/passport-facebook/node_modules/passport-oauth/lib/passport-oauth/strategies/oauth2.js:133:18)
    at Promise.module.exports.passport.use.GitHubStrategy.clientID (/Users/naorye/dev/naorye/myproj/config/passport.js:91:24)
    at Promise.onResolve (/Users/naorye/dev/naorye/myproj/node_modules/mongoose/node_modules/mpromise/lib/promise.js:162:8)
    at Promise.EventEmitter.emit (events.js:96:17)
    at Promise.emit (/Users/naorye/dev/naorye/myproj/node_modules/mongoose/node_modules/mpromise/lib/promise.js:79:38)
    at Promise.fulfill (/Users/naorye/dev/naorye/myproj/node_modules/mongoose/node_modules/mpromise/lib/promise.js:92:20)
    at /Users/naorye/dev/naorye/myproj/node_modules/mongoose/lib/query.js:1822:13

내가 넣어 것을 읽고 app.use(passport.initialize());app.use(passport.session());이전 app.use(app.router);이 내가 한 일이다. 미들웨어를 등록하는 내 express.js는 다음과 같습니다.

var express = require('express'),
    mongoStore = require('connect-mongo')(express),
    flash = require('connect-flash'),
    helpers = require('view-helpers');

module.exports = function (app, config, passport) {
    app.set('showStackError', true);
    // should be placed before express.static
    app.use(express.compress({
        filter: function (req, res) {
            return /json|text|javascript|css/.test(res.getHeader('Content-Type'));
        },
        level: 9
    }));
    app.use(express.favicon());
    app.use(express.static(config.root + '/public'));

    app.use(express.logger('dev'));

    // set views path, template engine and default layout
    app.set('views', config.root + '/app/views');
    app.set('view engine', 'jade');

    app.configure(function () {
        // use passport session
        app.use(passport.initialize());
        app.use(passport.session());

        // dynamic helpers
        app.use(helpers(config.app.name));

        // cookieParser should be above session
        app.use(express.cookieParser());

        // bodyParser should be above methodOverride
        app.use(express.bodyParser());
        app.use(express.methodOverride());

        // express/mongo session storage
        app.use(express.session({
            secret: 'linkit',
            store: new mongoStore({
                url: config.db,
                collection : 'sessions'
            })
        }));

        // connect flash for flash messages
        app.use(flash());

        // routes should be at the last
        app.use(app.router);

        // assume "not found" in the error msgs
        // is a 404. this is somewhat silly, but
        // valid, you can do whatever you like, set
        // properties, use instanceof etc.
        app.use(function(err, req, res, next){
            // treat as 404
            if (~err.message.indexOf('not found')) {
                return next();
            }

            // log it
            console.error(err.stack);

            // error page
            res.status(500).render('500', { error: err.stack });
        });

        // assume 404 since no middleware responded
        app.use(function(req, res, next){
            res.status(404).render('404', {
                url: req.originalUrl,
                error: 'Not found'
            });
        });
    });
};

뭐가 잘못 되었 니?

업데이트 @Peter Lyons에 따르면 구성 순서를 다음과 같이 변경했지만 여전히 동일한 오류가 발생합니다.

var express = require('express'),
    mongoStore = require('connect-mongo')(express),
    flash = require('connect-flash'),
    helpers = require('view-helpers');

module.exports = function (app, config, passport) {
    app.set('showStackError', true);
    // should be placed before express.static
    app.use(express.compress({
        filter: function (req, res) {
            return /json|text|javascript|css/.test(res.getHeader('Content-Type'));
        },
        level: 9
    }));
    app.use(express.favicon());
    app.use(express.static(config.root + '/public'));

    app.use(express.logger('dev'));

    // set views path, template engine and default layout
    app.set('views', config.root + '/app/views');
    app.set('view engine', 'jade');

    app.configure(function () {

        // dynamic helpers
        app.use(helpers(config.app.name));

        // cookieParser should be above session
        app.use(express.cookieParser());

        // bodyParser should be above methodOverride
        app.use(express.bodyParser());
        app.use(express.methodOverride());

        // express/mongo session storage
        app.use(express.session({
            secret: 'linkit',
            store: new mongoStore({
                url: config.db,
                collection : 'sessions'
            })
        }));

        // connect flash for flash messages
        app.use(flash());

        // use passport session
        app.use(passport.initialize());
        app.use(passport.session());

        // routes should be at the last
        app.use(app.router);

        // assume "not found" in the error msgs
        // is a 404. this is somewhat silly, but
        // valid, you can do whatever you like, set
        // properties, use instanceof etc.
        app.use(function(err, req, res, next){
            // treat as 404
            if (~err.message.indexOf('not found')) {
                return next();
            }

            // log it
            console.error(err.stack);

            // error page
            res.status(500).render('500', { error: err.stack });
        });

        // assume 404 since no middleware responded
        app.use(function(req, res, next){
            res.status(404).render('404', {
                url: req.originalUrl,
                error: 'Not found'
            });
        });
    });
};

Express 4.x 버전은 일부 방법을 지원하지 않습니다. github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x
miksiii

답변:


206

Express를 사용하면 쉽게 들어갈 수있는 비 순차적 인 미들웨어 지옥을 피하려면 예제를 따르십시오. 문서에서 바로. 귀하의 것이 정확히 일치하지 않는지 확인하십시오.

var app = express();
app.use(require('serve-static')(__dirname + '/../../public'));
app.use(require('cookie-parser')());
app.use(require('body-parser').urlencoded({ extended: true }));
app.use(require('express-session')({
  secret: 'keyboard cat',
  resave: true,
  saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());

문서

  1. cookieParser
  2. 세션
  3. passport.initialize
  4. passport.session
  5. app.router

당신

  1. passport.initialize
  2. passport.session
  3. cookieParser
  4. 세션
  5. app.router

제안한대로 변경했지만 여전히이 오류가 발생합니다. 새로운 express.js 파일로 내 질문을 업데이트했습니다.
Naor

7
따라서 여기에있는 코드는 최상위 코드가 아닙니다. 이전 프로그램에서 당신은 어떤 통화를하고있다 app.get, app.post등? 그러면 라우터가 의도 한 것보다 빨리 스택에 추가됩니다. 객체 express()를 얻기 위해 함수를 호출 할 때 시작하는 모든 멋진 코드를 보여주세요 app. 두 번째 추측입니다.
Peter Lyons

3
나는 app.use (app.router); 여권 초기화 후 호출되지만 다음을 호출합니다. require ( './ config / routes') (app, passport, auth); 익스프레스 구성을 요청하기 전에. 두 라인 사이를 전환하면 문제가 해결되었습니다. 감사!
Naor 2013 년

1
이것은 나를 위해 일했습니다! 그런데 왜 미들웨어가 그런 순서로되어 있어야합니까?
Anthony To

3
설계에 따라 수행중인 전제 조건에 의존 할 수 있습니다. cookieParser가 아직 쿠키를 구문 분석하지 않은 경우 세션이 작동하지 않습니다.
Peter Lyons

12

제 경우에는 (동일한 오류 메시지) 여권 초기화를 전혀 추가하는 것을 잊었습니다.

app.configure(function () {
    ...
    app.use(passport.initialize());
    app.use(passport.session());
});

업데이트 : Express 버전 3, 버전 4까지만 작동하면 더 이상 app.configure ()가 지원되지 않습니다.


1
App.configure는 더 이상 사용할 수 없습니다. github.com/strongloop/express/wiki/… .. 여권 문서를 업데이트해야합니다. 권리?
jack blank

9

내 경우에는 오류가 나는 promisify려고했기 때문에 req.login바인딩하지 않고 thisreq함수가 그것을 찾을 수 없습니다 호출 된 때, passport설정을. 솔루션은 Node v8을 사용 req.login.bind(req)하는 promisify경우 전달하기 전에 바인딩 합니다.


그리고이 "범위 문제"는 예를 들어 첫 번째 인수로 function({ login })전달하는 req것과 같은 구조화 인수를 사용할 때 발생합니다 . 귀하의 솔루션은 나를 위해 감사했다
마누엘 디 Iorio을

this, Javascript에서 작동 하는 방식입니다. 당신이 객체 방법으로 함수를 호출하지 않는 경우 this가 될 것이다 undefined(또는 window브라우저)
지아이 후

이 답변을 읽고 이해하지 못하는 사람을위한 팁 ... Function.prototype.call,, Javascript에서 작동 Function.prototype.apply하는 this방식 및 프로토 타입 상속의 원리 를 조사 하면 프로세스에서 Javascript Guru 수준으로 승격됩니다. :)
Stijn de Witt

건배, 나는 그것이 단순하게 될 거라고 기대했다util.promisify(req.login.bind(req));
줄리안 H. 램

4

어떤 날도 넣어했다 도왔다 경로를 후에 쿠키 설정 :

// init Cookies:
app.use(
    cookieSession({
        maxAge: 30 * 24 * 60 * 60 * 1000,
        keys: [keys.cookieKey]
    })
);
app.use(passport.initialize());
app.use(passport.session());

// init routes
const authRoutes = require("./routes/authRoutes")(app);

구성 작업 후 init 경로가 왜인지 알 수 있습니까?
Ishu

이것은 내 문제를 해결했습니다. 나는 모든 경로를 옮겼습니다. 여권과 관련된 모든 것을 사용하십시오.
Nick Van Brunt

2

Peter Lyons의 답변은 제가 문제를 해결하는 데 도움이되었지만 조금 다른 방식으로 해결했습니다.

app.use(
  cookieSession({
    maxAge: 30 * 24 * 60 * 60 * 1000,
    keys: [keys.cookieKey],
  }),
);
app.use(passport.initialize());
app.use(passport.session());

여기의 코드 스 니펫뿐만 아니라 전체 코드에 대한 내 GitHub 저장소 를 살펴보십시오 .


1

제 경우에는 (동일한 오류 메시지) 사용자 지정 전략을 개발 중이었고 session을 사용할 필요가 없습니다 . session: false내 경로 authenticate미들웨어 를 추가 하는 것을 잊었습니다 .

  app.post('/api/public/auth/google-token',
    passport.authenticate('google-token', {
      session: false
    }),
    function (req: any, res) {
      res.send("hello");
    }
  );
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.