2

次のコードがあり、入力するたびに0.0.0.0:3000/user?apikey=xxx、ローカル戦略内のコードが実行されず、「許可されていない」ページに直接移動します。からpassport.authenticateを削除しようとしましたserver.get('/user')。デバッグ モードでは、「apikey」が解析されてパラメーター マップが要求されていることがわかりました。したがって、ここでの問題は、パスポートが get 要求を認証できないことです。どんな助けでも大歓迎です。ありがとう!

var restify = require('restify');
// Create server
var server = restify.createServer({
    name: 'server'
});
server.use(restify.queryParser());
server.use(restify.bodyParser());


var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;

passport.use(new LocalStrategy(
    function (apikey, done) {
        console.log('Entered authentication.');
        done(null, null);
    }
));


//specify route
server.get('/user', passport.authenticate('local'), function (req, res) {
    console.log(req.params);
    res.end('haha');
});

server.listen(3000, function () {
    console.log('%s listening at %s', server.name, server.url)
});
4

2 に答える 2

0

もう 1 つの方法は、単純に HTTP BASIC 認証を使用することです。このように、ユーザー ID/パスワードは URI の一部ではなく認証ヘッダーで送信されます。これは、サービスを保護するためのかなり一般的なアプローチであるためです (HTTPS 経由でこれを行うようにしてください)。私はこの小さなモジュールを書いて、 passport-httpのいくつかの例から部分的に借用しました。

var restify = require('restify'),
    userId = process.env.serviceID,
    pwd = process.env.servicePassword,
    passport = require('passport'),
    BasicStrategy = require('passport-http').BasicStrategy;

passport.use(new BasicStrategy(
    function (username, password, done) {
        findByUsername(username, function (err, user) {
            if (err) {
                return done(err);
            }
            if (!user) {
                return done(null, false, { message: 'Incorrect username.' });
            }
            if (user.password !== password) {
                return done(null, false, { message: 'Incorrect password.' });
            }
            return done(null, user);
        });
    }
));

var users = [
    { id: 1, username: userId, password: pwd}
];

function findByUsername(username, fn) {
    for (var i = 0, len = users.length; i < len; i++) {
        var user = users[i];
        if (user.username === username) {
            return fn(null, user);
        }
    }
    return fn(null, null);
}

exports.authenticate = function (req, res, next, callback) {
    passport.authenticate('basic', function (err, user) {
        if (err) {
            console.log(err);
            return next(err);
        }
        if (!user) {
            var error = new restify.InvalidCredentialsError("Failed to authenticate to ma-services.");
            console.log(error);
            res.send(error);
            return next();
        }

        callback(req, res, next);
    })(req, res, next);
};

これを呼び出すには、サーバーが呼び出すエクスポートされた API 呼び出しから次のことを行うだけです。

var basicAuth = require(__dirname + '/../utils/authn.js');
exports.count = function (req, res, next) {
    basicAuth.authenticate(req, res, next, function() {
        validateParam(req.params.uid, next);
        var url = '/count/' + encodeURIComponent(req.params.uid);

        processRequest(req, res, next, url);
    });
};
于 2014-11-04T19:50:38.970 に答える