web-dev-qa-db-ja.com

NodeおよびExpress 4を使用した基本HTTP認証

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();
    }
});
89
Dov

元の 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();
    }
});
33
Dov

多くのミドルウェアがv4のExpressコアから取り出され、個別のモジュールに配置されました。基本的な認証モジュールはこちらです: https://github.com/expressjs/basic-auth-connect

あなたの例はこれに変更するだけです:

var basicAuth = require('basic-auth-connect');
app.use(basicAuth('username', 'password'));
57
Brian Prodoehl

TL; DR:

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!
}));
40
rsp

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);
32
WarsClon

それを行うための複数のモジュールがあるようで、一部は非推奨です。

これはアクティブに見えます:
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ミドルウェアを正しい場所に置いてください。それ以前のミドルウェアは認証されません。

19
Michael

モジュールを必要とせずに基本認証を実装できます

//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

5
VIKAS KOHLI

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:passbase64 エンコーディング、またはこの場合はaladdin:opensesameと等しいYWxhZGRpbjpvcGVuc2VzYW1lを使用する必要があります

カールリクエストは次のようになります。

 curl -H "Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l" http://localhost:3000/
1
Loourr