Nodejs restful api auth method
Nodejs restful api auth method
如何在nodejs 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服务时,服务器端不应该有某种状态。我的意思是没有登录和注销。如果您想利用令牌,您应该需要一个授权资源,该资源为凭据提供一个临时令牌,并能够在令牌过期时对其进行刷新。
希望它能帮助你,Thierry
相关文章:
- document.applet.method在Mounatin Lion上抛出safari 6+JDK7异常
- 当method=post时,jQueryAjax返回404
- 当达到codeigniter/tank auth会话超时时,在ajax调用中处理php重定向
- 调用laravel{{action(Controller@method}}通过传递vue.js数组中的变量
- 对auth.logout的Facebook事件订阅仅选择性地将用户重定向到url
- 为什么我会得到一个“;auth失败”;使用正确的凭据连接到MongoDB时出错
- FB.Event.subscribe auth.statusChange未在Angular JS中启动
- “Ember Simple Auth”使组件的会话无效
- Java eqivalent method of “splice(a,b,..)“在 JavaScript 方法中
- JavaScript Loop to setData method
- Extending jQuery.fn.method
- Javascript - jQuery preventDefault method
- 如何显示Ajax Get-Method中的数据
- Javascript method win.validate();
- fine uploader uploadStoredFiles method
- Auth$getUser返回null,即使用户已登录(AngularFire,Firebase)
- 在Mocha和SuperTest中设置基本Auth
- jQuery deferred method and ajax beforeSend()
- 调用Action Method,关闭对话框并刷新父项
- Nodejs restful api auth method