Node.js REST API 的 SSO 身份验证(cansecurity、passport)

bro*_*lee 5 javascript rest node.js express passport.js

我一直在努力通过 Node.js 为数据库构建一个简单的 REST API,并希望为不同用户实现具有授权规则的基本单点登录结构。我开始使用护照(特别是本地护照),它在身份验证和轻松登录/注销服务方面做得很好——但似乎对无状态设置不友好。

在进一步研究中,我遇到了cansecurity并认为它具有我正在寻找的功能。阅读完文档后,我在真正进入这个过程时遇到了一些问题:

1)我如何实际发送登录/注销请求?

我看到了 cansecurity 如何允许对不同的路由进行授权,并且我编写了一个验证函数来检查散列密码、检索用户等。但是有没有人对实际执行单点登录以使用户登录有任何了解?

2) 是否有一种简单的方法可以将访问信息集成到外部源中?

理想情况下,我希望有一个使用 API 来执行数据库操作的移动应用程序(因此希望拥有 SSO 和相当强大的授权框架)。

如果有人使用过 Passport 或 cansecurity 进行过类似的设置,你是怎么做的,我可能会遗漏哪些步骤?

设置安全:

var cs = require('cansecurity')
    , cansec = cs.init( 
    {
        sessionExpiry: 60, 
        sessionKey: SESSIONKEY,
        validate: 
            function(username, password, done) {
                User.findOne({ username: username }, function(err, user) {
                    if (err) return done(err);
                    if (!user) {
                        return done(false, null, { message: 'Incorrect username.' }, null);
                    }
                    if(password !== undefined){
                        user.validPassword(password, function(err, result) {
                            if (result == true) return done(true, user, null, user.password);
                            else return done(false, null, {message: 'Incorrect password.'}, null);
                        });
                    }
                    else return done(true, user, null, user.password);
                });
        }
    })
Run Code Online (Sandbox Code Playgroud)

设置护照

//passport
passport.use(new LocalStrategy(
   function(username, password, done) {
      User.findOne({ username: username }, function(err, user) {
         if (err) return done(err);
         if (!user) {
             return done(null, false, { message: 'Incorrect username.' });
         }
         user.validPassword(password, function(err, result) {
             if (result == true) return done(null, user);
             else return done(null, false, {message: 'Incorrect password.'});
         });
    });
}));

passport.serializeUser(function(user, done) {
   done(null, user.id);
});

passport.deserializeUser(function(id, done) {
   User.get(id, function(err, user) {
       done(err, user);
   });
});

// Routes
//login
app.post('/login',
      passport.authenticate('local', { successRedirect: '/home',
                                       failureRedirect: '/',
                                       failureFlash: false })
);

//logout
app.get('/logout', function(req, res){
   req.logout();
   res.redirect('/');
});
Run Code Online (Sandbox Code Playgroud)