NodeJS Passport:通过两种策略multilogin – 序列化问题
我想提供用户login两种策略之一的能力:通过Instagram和通常的本地策略。 对于本地我写了简单的function,findDB中的用户,并提供它的用户信息。 这是如何工作的:
passport.use(new InstagramStrategy({ clientID: global.INSTAGRAM_CLIENT_ID, clientSecret: global.INSTAGRAM_CLIENT_SECRET, callbackURL: "http://**.**.**.**:3000/auth/instagram/callback" }, function(accessToken, refreshToken, profile, done) { process.nextTick(function () { console.log('Access token: ' + accessToken); global.access_token = accessToken; return done(null, profile); }); } )); passport.use(new LocalStrategy( function(email, password, done) { console.log('chec user'); process.nextTick(function() { db.findByEmail(email, function(err, user) { if (!user) { console.log('Unknown user ' + email); return done(null, false, { message: 'Unknown user ' + email }); } if (user.password != crypt.getMD5fromString(password)) { console.log('Invalid password'); return done(null, false, { message: 'Invalid password' }); } return done(null, user); }) }); }));
然而,我的自定义序列化和deSerialize函数不适用于Instagram战略:
/* THESE FUNCTIONS WORK WITH INSTAGRAM STRATEGY passport.serializeUser(function(user, done) { done(null, user); }); passport.deserializeUser(function(obj, done) { done(null, obj); });*/ /*THESE ARE FOR LOCAL STRATEGY*/ passport.serializeUser(function(user, done) {done(null, user._id);}); passport.deserializeUser(function(id, done) {db.findById(id, function(err, user) {done(err, user);});});
如何避免这个错误? 我的目标 – 提供Instagramlogin,并成功login后检查 – 如果用户有本地帐户(通过电子邮件或Instagram昵称),从数据库中获取数据。 虽然用户应该有能力通过本地策略没有Instagram的login。 谢谢。
简短的回答是:对于本地和第三方validationcallback,使用相同的用户对象types。 你可能想要在你的Instagramvalidationcallback中设置它:而不是调用done(null,profile)
你可能想要创build一个新的User对象,分配myUser.instagram = profile
和callbackdone(null, myUser)
东西那。
我有一些示例代码演示了设置多个身份validation系统的一种方法。 你可以在这里find它: https : //github.com/therealplato/passport-multiauth-demo/blob/master/app.js
情侣注意事项:这是为Express 2.x编写的,它处理与3不同的服务器,并具有用于发送响应的不同语法。 编辑,演示代码更新为Express 3.x
另外谷歌的方法在这里是Oauth 1.我不能得到Oauth 1谷歌身份validation在本地主机上工作,它给出了一个错误...has no method 'CharChodeAt'...
有趣的是,我今天花在了让Oauth 2和我的本地用户打好关系。 所以,如果我能find时间,我会尝试更新Express 3和Oauth 2的演示代码,但没有承诺:)
- InternalOAuthError:无法获取访问令牌
- 会话身份validationtypes错误:对象#属性“types”<ServerResponse>不是函数
- 如何在创build用户之前validation电子邮件?
- 要求Passport.js / Node.js目录(除了一个页面)的身份validation?
- 简单的RESTauthentication策略?
- Express / Node应用程序的身份validationlogin体系结构
- Sails.js:如何使用sails-generate-auth注册用户后返回访问令牌?
- Node.js聊天 – 用户authentication
- SailsJS + PassportJS(sails-generate-auth) – 无法login用户