我使用node.sdk,stormpath,express.js和passport.js为我的新网站建立了一个用户帐户系统。所以我设置了一个自定义数据槽的帐户。我想知道如何在他们登录时将新数据发布到此自定义数据槽并在其登录时检索它。我不熟悉使用节点而且我不知道在哪里放置我的代码或者如何访问'用户'他们登录后的帐户信息。据我所知,passport.js正在处理身份验证,因此我可能无法看到用户通过电子邮件在stormpath api上搜索他们的用户帐户网址...也许我'我在这里遗漏了什么?
router.post('/register', function(req, res) {
var username = req.body.username; var password = req.body.password;
// Grab user fields. if (!username || !password) { return res.render('register', { title: 'Register', error: 'Email and password required.' }); }
// Initialize our Stormpath client. var apiKey = new stormpath.ApiKey( process.env['STORMPATH_API_KEY_ID'], process.env['STORMPATH_API_KEY_SECRET'] ); var spClient = new stormpath.Client({ apiKey: apiKey });
var app = spClient.getApplication(process.env['STORMPATH_APP_HREF'], function(err, app) { if (err) throw err;
account = {
givenName: 'John',
surname: 'Smith',
username: username,
email: username,
password: password,
customData:{
favList:'',
},
};
app.createAccount(account, function (err, createdAccount) {
if (err) {
return res.render('register', {'title': 'Register', error: err.userMessage });
} else {
passport.authenticate('stormpath')(req, res, function () {
return res.redirect('/home');
});
}
});
});
});
//渲染登录页面。 router.get(' / login',function(req,res){ res.render('登录',{标题:'登录',错误:req.flash('错误')[0]}); });
//验证用户。 router.post(' / login', passport.authenticate(' stormpath',{successRedirect:' / home',failureRedirect:' / login',failureFlash:'哎呀我想你需要一个帐户进入这里..Soz',}));
//渲染仪表板页面。 router.get(' / home',function(req,res){if(!req.user || req.user.status!==' ENABLED'){return res。重定向(' / login');}
res.render(' home',{title:' Home',user:req.user,}); });
答案 0 :(得分:5)
这是一个很好的问题。值得庆幸的是,Passport API可以满足您的需求。您想使用“自定义回调”功能,然后您可以访问该功能内部的用户。在Stormpath策略的情况下,用户对象将是Stormpath帐户实例。但是,您需要重新实现当前作为选项传递的一些重定向逻辑。以下是Stormpath策略的示例:
app.post('/login', function(req, res, next) {
passport.authenticate('stormpath', function(err, user, info) {
if (err) {
return next(err);
}
else if (user) {
console.log('The account is: ', user);
req.logIn(user, function(err) {
if (err) {
next(err);
}else{
res.redirect('/dashboard');
}
});
}else{
req.flash('error',info.message);
res.redirect('/login');
}
})(req, res, next);
});
此自定义策略的文档可在此处找到:http://passportjs.org/guide/authenticate/
另一个注意事项:我建议在路由处理程序之外创建spClient。 Stormpath客户端可用于多个请求,每个进程只需创建一次。