如何在nodejs restful API中正确执行auth?我已经创建了基本API,例如example.com/books/
会给我一个来自我的数据库的书籍列表。我可以允许登录用户使用API,通过检查会话是否存在。这么简单吗?为什么需要基于令牌的身份验证?
答案 0 :(得分:0)
这取决于您要实施的安全类型。每个你都可以利用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服务时,您不应该在服务器端具有某种状态。我的意思是没有登录和注销。如果要利用令牌,则需要一个授权资源,该资源为您提供凭据的临时令牌,并且能够在到期时刷新凭据。
希望它可以帮到你, 亨利