首页 文章

调用和保存用户帐户自定义数据

提问于
浏览
2

我正在使用node.sdk,stormpath,express.js和passport.js为我的新网站 Build 一个用户帐户系统 . 所以我 Build 了一个自定义数据槽的帐户 . 我想知道如何在他们登录时将新数据发布到此自定义数据槽并在登录时检索它 . 我是新手使用节点而我不知道在哪里放置我的代码或如何访问他们登录后的'用户'帐户信息 . 从我可以告诉passport.js正在处理身份验证,所以我可能无法看到用户通过电子邮件在stormpath api上搜索他们的用户帐户URL ...也许我'我在这里遗失了什么?

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('login',{title:'Login',error:req.flash('error')[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.redirect('/ login');}

res.render('home',{title:'Home',user:req.user,}); });

1 回答

  • 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客户端可用于多个请求,每个进程只需创建一次 .

相关问题