如何在Node.js Restful API中正确执行身份验证?我已经创建了基本的API,例如example.com/books/将为您提供数据库中的书籍列表。通过检查会话是否存在,我可以允许登录的用户使用API​​。这么简单吗?为什么需要基于令牌的身份验证?

最佳答案

这取决于您要实现哪种安全性。您可以利用HTTP基本身份验证。这完全对应于具有Authorization标头,该标头包含用Base64编码的用户名/密码:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==


有关信息,QWxhZGRpbjpvcGVuIHNlc2FtZQ==等于encodeBase64('username:password)(伪代码)。

在服务器端和Express应用程序中,可以使用basic-auth模块来实现以下安全中间件。它将从请求中提取用户名/密码,并检查是否匹配。为了简单起见,在这里进行了硬编码,但是应该检查数据库。

var basicAuth = require('basic-auth');

function unauthorized(res) {
  res.set('WWW-Authenticate', 'Basic realm=Authorization Required');
  return res.status(401).end();
}

// Hardcoded username / password
var username = 'foo';
var password = 'bar';

var basicAuthMiddleware = function() {
  return function(req, res, next) {
    var user = basicAuth(req);

    if (!user || !user.name || !user.pass) {
      return unauthorized(res);
    }

    if (user.name === username && user.pass === password) {
      return next();
    } else {
      return unauthorized(res);
    }
  };
};

expressApplication.use(basicAuthMiddleware);


如果您想要更通用的东西,即可以轻松更改身份验证策略的能力,我建议您看一下Passport库。

在这种情况下,前者将按如下所述进行重做:

var passport = require('passport');

passport.use(new BasicStrategy(
  function(username, password, done) {
    User.findOne({ username: username }, function (err, user) {
      if (err) {
        return done(err);
      }

      if (!user) {
        return done(null, false);
      }

      if (!user.validPassword(password)) {
        return done(null, false);
      }

      return done(null, user);
    });
  }
));

expressApplication.use(passport.initialize());


您还可以使用更高级的安全性机制,例如基于令牌的身份验证或OAuth2。 Passport为他们提供了一些支持。

否则,我建议您阅读以下博客文章:


为RESTful应用程序使用令牌实现身份验证:https://templth.wordpress.com/2015/01/05/implementing-authentication-with-tokens-for-restful-applications/


一句话。实现RESTful服务时,服务器端不应处于某种状态。我的意思是没有登录和注销。如果要利用令牌,则需要一个授权资源,该资源为您提供一个临时的凭证令牌,并可以在凭证过期时对其进行刷新。

希望对您有帮助,
蒂埃里

关于javascript - Node.js Restful API Auth方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33908740/

10-12 04:44