基本访问认证
Restify 捆绑了一个authorizationParser
插件。authorizationParser
解析出Authorization
. 当插件在使用中时,它将使req.username
和req.authorization
属性可用。后者的格式是:
{
scheme: <Basic|Signature|...>,
credentials: <Undecoded value of header>,
basic: {
username: $user
password: $password
}
}
您的服务器将需要选择性地拦截需要身份验证的请求并验证用户访问凭据。
这是一个示例服务器,它将要求对所有调用进行身份验证:
var restify = require('restify'),
server;
server = restify.createServer();
server.use(restify.authorizationParser());
server.use(function (req, res, next) {
var users;
// if (/* some condition determining whether the resource requires authentication */) {
// return next();
// }
users = {
foo: {
id: 1,
password: 'bar'
}
};
// Ensure that user is not anonymous; and
// That user exists; and
// That user password matches the record in the database.
if (req.username == 'anonymous' || !users[req.username] || req.authorization.basic.password !== users[req.username].password) {
// Respond with { code: 'NotAuthorized', message: '' }
next(new restify.NotAuthorizedError());
} else {
next();
}
next();
});
server.get('/ping', function (req, res, next) {
res.send('pong');
next();
});
server.listen(8080);
最简单的测试方法是使用 curl:
$ curl -isu foo:bar http://127.0.0.1:8080/ping
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 6
Date: Fri, 12 Dec 2014 10:52:17 GMT
Connection: keep-alive
"pong"
$ curl -isu foo:baz http://127.0.0.1:8080/ping
HTTP/1.1 403 Forbidden
Content-Type: application/json
Content-Length: 37
Date: Fri, 12 Dec 2014 10:52:31 GMT
Connection: keep-alive
{"code":"NotAuthorized","message":""}
Restify 带有支持基本身份验证的内置JsonClient,例如
var restify = require('restify'),
client;
client = restify.createJsonClient({
url: 'http://127.0.0.1:8080'
});
client.basicAuth('foo', 'bar');
client.get('/ping', function(err, req, res, obj) {
console.log(obj);
});
OAuth 2.0
如果您更喜欢令牌身份验证,那么您可以使用实现客户端凭据身份验证流程的 restify-oauth2包,这就是您所追求的。
文档页面逐步描述了如何设置此类身份验证,包括每个端点的角色,并且在其存储库中有一个代码示例。
概括
无论您选择哪种身份验证方法,它们都要求您使用 HTTPS。不同之处在于,如果用户名/密码被泄露,用户将需要更改其凭据。如果令牌被泄露,则用户将需要请求新令牌。后者可以通过编程方式完成,而前者通常依赖于硬编码值。
边注。在生产中,如果至少通过不安全的通道传输凭据(例如受损的 HTTPS),则必须将凭据视为“受损”,例如出现 SSL 错误(例如Heartbleed)。