【问题标题】:serializeUser and deserializeUser not called; req.user always empty in PassportJS Express app未调用 serializeUser 和 deserializeUser;在 PassportJS Express 应用程序中,req.user 始终为空
【发布时间】:2014-12-11 20:52:25
【问题描述】:

所以我有一个基于 generator-angular-fullstack 的小应用程序。我想向当前登录的用户添加新帐户(Withings)的凭据。 这个想法是,登录的用户还可以添加其他方式来使用 Withings 或 Twitter 或 Facebook 进行登录。

这些是我的路线:

router
.get('/', passport.authorize('withings', { 
    failureRedirect: '/'
}))

.get('/callback', passport.authorize('withings', {
    successRedirect : '/settings',
    failureRedirect : '/'
}));

这是回调实现:

passport.use(new WithingsStrategy({
    consumerKey: config.withings.clientID,
    consumerSecret: config.withings.clientSecret,
    callbackURL: config.withings.callbackURL,
    passReqToCallback: true
  },
  function(req, token, tokenSecret, profile, done) {

    console.log('user' + req.user);

    return done(null, null);

  }
));

关键是当我回到函数时,即使我已登录,req.user 始终是 undefined

有人有想法吗?我读到您需要几个函数,例如 deserializeUserserializeUser,但它们永远不会被调用。

想法?我是这种事情的新手,经过 3-4 晚感到沮丧:(

PS:这是我的配置

  app.set('views', config.root + '/server/views');
  app.engine('html', require('ejs').renderFile);
  app.set('view engine', 'html');
  app.use(compression());
  app.use(bodyParser.urlencoded({ extended: false }));
  app.use(bodyParser.json());
  app.use(methodOverride());
  app.use(cookieParser());
  app.use(passport.initialize());
  app.use(passport.session()); //persistent login session




  // Persist sessions with mongoStore
  // We need to enable sessions for passport twitter because its an oauth 1.0 strategy
  app.use(session({
    secret: config.secrets.session,
    resave: true,
    saveUninitialized: true,
    store: new mongoStore({ mongoose_connection: mongoose.connection })
  }));

  if ('production' === env) {
    app.use(favicon(path.join(config.root, 'public', 'favicon.ico')));
    app.use(express.static(path.join(config.root, 'public')));
    app.set('appPath', config.root + '/public');
    app.use(morgan('dev'));
  }

  if ('development' === env || 'test' === env) {
    app.use(require('connect-livereload')());
    app.use(express.static(path.join(config.root, '.tmp')));
    app.use(express.static(path.join(config.root, 'client')));
    app.set('appPath', 'client');
    app.use(morgan('dev'));
    app.use(errorHandler()); // Error handler - has to be last
  }

【问题讨论】:

标签: passport.js withings


【解决方案1】:

我知道这个问题很老了,但如果其他人通过它,我会看到 2 个问题。

首先,在你的回调实现中你说:

return done(null, null);

done 的 API 是 done([err], [user])。您的代码通过将 null 作为第二个参数传递给 done,表示您没有找到用户,因此护照没有登录用户。您实际上需要说:

return done(null, profile);

其次,你需要移动这些行:

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

在您的app.use(session({...})) 电话下方。 Passport 依赖于 express 会话,因此您需要在初始化护照之前设置 express 会话。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2016-03-24
    • 2015-04-01
    • 2015-05-17
    • 2012-07-01
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 2019-02-08
    • 2021-08-16
    相关资源
    最近更新 更多