所以我有一个基于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
。
有没有人有想法?我读到你需要一些功能,如deserializeUser
和serializeUser
,但它们永远不会被调用。
想法?我是这种事情的新手,经过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
}
答案 0 :(得分:2)
我知道这个问题已经过时了,但如果有其他人过来,我会看到2个问题。
首先,在你的回调实现中你说:
return done(null, null);
done
的API为done([err], [user])
。通过将null
作为完成的第二个参数传递,您的代码表示您没有找到用户,因此护照不会记录用户。您实际上需要说:
return done(null, profile);
其次,你需要移动这些行:
app.use(passport.initialize());
app.use(passport.session());
低于app.use(session({...}))
来电。 Passport取决于快速会话,因此您需要在初始化护照之前设置快速会话。
希望这有帮助!