Basic access authentication
的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包實現Client Credentials認證流程,這是你所追求的。
文檔頁面逐步介紹如何設置此類認證,包括每個端點的角色,並且其存儲庫中有一個code example。
摘要無論您選擇哪種身份驗證方法的
,所有的人都需要你使用HTTPS。區別在於,如果用戶名/密碼被泄露,用戶需要更改他們的憑據。如果令牌受損,則用戶需要請求新的令牌。後者可以通過編程完成,而前者通常依賴於硬編碼值。
附註。在生產中,如果通過不安全的信道至少傳送一次證書,則證書必須被認爲是「妥協的」,例如,受影響的HTTPS,例如SSL漏洞,例如Heartbleed。
如果你可以使用https,你將不會陷入這樣的中間人攻擊問題。只要你在http上,令牌就會受到攻擊。 – Chandu
謝謝。我聽說使用https將會有一些性能折衷。這是唯一的解決方案嗎?關於我的另一個問題,在node.js中是否有一個用於基於標記的身份驗證的庫?謝謝! – user2440712
http://passportjs.org/它支持oauth – Chandu