3

Express.js フレームワークを使用して、Node.js で REST JSON Api を構築しています。認証には HTTP Basic を使用します。これまでの私のコードは次のとおりです。

var express = require('express');
var app = express();

app.configure(function(){
  app.use(express.bodyParser());
});

// Http basic auth.

app.use(function(req, res, next){
  if(req.headers.authorization && req.headers.authorization.search('Basic ') === 0){
    var header = new Buffer(req.headers.authorization.split(' ')[1], 'base64').toString();
    var headerSplit = header.split(':');
    var username = headerSplit[0];
    var password = headerSplit[1];

    if(username && password && (username.length >= 4 && password.length >= 2){
        if(auth(username, password)){
          next(); return;
        } else {
          res.send('Authentication required', 401);
        }
    }
  } else {
    res.header('WWW-Authenticate', 'Basic realm="Login with username/password"');
    res.send('Authentication required', 401);
  }
});

// Public
app.post('/restore-password', function(req, res){
});

// Public
app.get('/search', function(req, res){
});

// Public
app.post('/users', function(req, res){
});

// Private
app.get('/user', function(req, res){
});

// Private
app.get('/protected-data', function(req, res){
});

REST API でパブリック関数とプライベート関数を適切に分離するにはどうすればよいですか? 私の質問が明確であることを願っています。

手伝ってくれてありがとう。

4

1 に答える 1

7

すべてのルートapp.useにミドルウェアを追加するため、使用しないでください。次のように認証ハンドラーを定義します。

function authentication_required(req, res, next){
    // The other authentication code goes here.
};

そして今、すべてのルートで(たとえば)これを行うことができます:

// Public
app.post("/restore-password", function(req, res) {
    console.log( "No need for authentication!" );
});

// Private (add authentication_required middleware to the route)
app.get("/settings", authentication_required, function(req, res) {
    console.log( "I'm authenticated, so I can read this!" );
});
于 2012-08-06T14:37:53.340 に答える