Express v3で基本的なHTTP認証を実装するのは簡単だったようです:
app.use(express.basicAuth('username', 'password'));
バージョン4(4.2を使用しています)がbasicAuth
ミドルウェアを削除したため、少し立ち往生しています。私は次のコードを持っていますが、それはブラウザがユーザーに資格情報を要求することを引き起こしません。
app.use(function(req, res, next) {
var user = auth(req);
if (user === undefined || user['name'] !== 'username' || user['pass'] !== 'password') {
res.writeHead(401, 'Access invalid for user', {'Content-Type' : 'text/plain'});
res.end('Invalid credentials');
} else {
next();
}
});
元の basicAuth
のコードを使用して、答えを見つけました。
app.use(function(req, res, next) {
var user = auth(req);
if (user === undefined || user['name'] !== 'username' || user['pass'] !== 'password') {
res.statusCode = 401;
res.setHeader('WWW-Authenticate', 'Basic realm="MyRealmName"');
res.end('Unauthorized');
} else {
next();
}
});
多くのミドルウェアがv4のExpressコアから取り出され、個別のモジュールに配置されました。基本的な認証モジュールはこちらです: https://github.com/expressjs/basic-auth-connect
あなたの例はこれに変更するだけです:
var basicAuth = require('basic-auth-connect');
app.use(basicAuth('username', 'password'));
express.basicAuth
はなくなりましたbasic-auth-connect
は非推奨ですbasic-auth
にはロジックがありませんhttp-auth
はやり過ぎですexpress-basic-auth
はあなたが望むものですExpressを使用しているので、express-basic-auth
ミドルウェアを使用できます。
ドキュメントを参照してください:
例:
const app = require('express')();
const basicAuth = require('express-basic-auth');
app.use(basicAuth({
users: { admin: 'supersecret123' },
challenge: true // <--- needed to actually show the login dialog!
}));
Express 4.0では、基本認証を http-auth で変更しました。コードは次のとおりです。
var auth = require('http-auth');
var basic = auth.basic({
realm: "Web."
}, function (username, password, callback) { // Custom authentication method.
callback(username === "userName" && password === "password");
}
);
app.get('/the_url', auth.connect(basic), routes.theRoute);
それを行うための複数のモジュールがあるようで、一部は非推奨です。
これはアクティブに見えます:
https://github.com/jshttp/basic-auth
以下に使用例を示します。
// auth.js
var auth = require('basic-auth');
var admins = {
'[email protected]': { password: 'pa$$w0rd!' },
};
module.exports = function(req, res, next) {
var user = auth(req);
if (!user || !admins[user.name] || admins[user.name].password !== user.pass) {
res.set('WWW-Authenticate', 'Basic realm="example"');
return res.status(401).send();
}
return next();
};
// app.js
var auth = require('./auth');
var express = require('express');
var app = express();
// ... some not authenticated middlewares
app.use(auth);
// ... some authenticated middlewares
auth
ミドルウェアを正しい場所に置いてください。それ以前のミドルウェアは認証されません。
モジュールを必要とせずに基本認証を実装できます
//1.
var http = require('http');
//2.
var credentials = {
userName: "vikas kohli",
password: "vikas123"
};
var realm = 'Basic Authentication';
//3.
function authenticationStatus(resp) {
resp.writeHead(401, { 'WWW-Authenticate': 'Basic realm="' + realm + '"' });
resp.end('Authorization is needed');
};
//4.
var server = http.createServer(function (request, response) {
var authentication, loginInfo;
//5.
if (!request.headers.authorization) {
authenticationStatus (response);
return;
}
//6.
authentication = request.headers.authorization.replace(/^Basic/, '');
//7.
authentication = (new Buffer(authentication, 'base64')).toString('utf8');
//8.
loginInfo = authentication.split(':');
//9.
if (loginInfo[0] === credentials.userName && loginInfo[1] === credentials.password) {
response.end('Great You are Authenticated...');
// now you call url by commenting the above line and pass the next() function
}else{
authenticationStatus (response);
}
});
server.listen(5050);
ソース: http://www.dotnetcurry.com/nodejs/1231/basic-authentication-using-nodejs
Expressはこの機能を削除したため、 basic-auth ライブラリの使用を推奨しています。
使用方法の例を次に示します。
var http = require('http')
var auth = require('basic-auth')
// Create server
var server = http.createServer(function (req, res) {
var credentials = auth(req)
if (!credentials || credentials.name !== 'aladdin' || credentials.pass !== 'opensesame') {
res.statusCode = 401
res.setHeader('WWW-Authenticate', 'Basic realm="example"')
res.end('Access denied')
} else {
res.end('Access granted')
}
})
// Listen
server.listen(3000)
このルートにリクエストを送信するには、基本認証用にフォーマットされた Authorization header を含める必要があります。
最初にcurlリクエストを送信するには、name:pass
の base64 エンコーディング、またはこの場合はaladdin:opensesame
と等しいYWxhZGRpbjpvcGVuc2VzYW1l
を使用する必要があります
カールリクエストは次のようになります。
curl -H "Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l" http://localhost:3000/