基本authentication与Node.js和restify
我目前正在用NodeJS开发一个REST风格的Web服务并进行调整 。
我已经把所有的东西都和node-mysql一起运行,但是我也想实现HTTP基本authentication。
我只用Apache和一个.htaccess
文件做了一次。
但是这里的Web服务器带有restify,我开始像这样:
var server = restify.createServer({ name: 'my webservice' });
在restify文档( http://mcavage.me/node-restify/#Bundled-Plugins )中列出了一个authenticationparsing器插件,但我不知道如何使用它。
即使使用http://user:pass@url...
, req.username
值也始终设置为匿名。
最好的事情是,如果我可以用.htpasswd
文件来存储/访问用户并传递。
有谁知道如何实现这与restify或其他模块?
最后,我find了一个没有任何额外模块的方法。
首先我发送correkt头文件:
var auth = req.headers['authorization']; res.statusCode = 401; res.setHeader('WWW-Authenticate', 'Basic realm="Secure Area"'); res.end('need creds');
然后我检查用户,并通过,如果它确定,然后发送正确的状态码
res.statusCode = 200; // OK
如果密码不正确:
res.statusCode = 401; // Force them to retry authentication res.setHeader('WWW-Authenticate', 'Basic realm="Secure Area"'); res.end('<html><body>You shall not pass</body></html>');
这工作得很好。 我只有读取.htpasswd和密码的麻烦。 有谁知道我可以检查.htpasswd文件的纯密码?
看看Passport.js 。 它支持基本HTTP作为authenticationscheme之一。
即使使用http:// user:pass @ url …. req.username值始终设置为匿名
该文档似乎表明,它期望在标题中的凭据不在URL中,您可能需要使用curl或除浏览器之外的其他工具来制作带有授权标头的标题。
有了快递,你可以做这样的事情:
var auth = express.basicAuth(function(user, pass) { return (user == "admin" && pass == "1234"); },'Super duper secret area'); app.get('/test', auth, function(req, res){ ... });
expressjs.com