2

我有一个 nodejs 应用程序,它使用 express.js 中的 http 基本身份验证。

在这个应用程序中,我向外部网页发出 http.get 请求以加载和解析 html。

使用基本身份验证,我在http.get(url, function(){})对外部主机的每个请求中都会收到一个错误:“未经授权”。如果我删除基本身份验证,它工作正常。

如果只有我自己的服务器具有此身份验证,任何人都知道为什么我在公共资源上未经授权?

例如(伪代码):

通过快速基本身份验证,我从 google.com 获得“未经授权”作为正文。没有身份验证,我得到了 html

    var auth = express.basicAuth(function(user, pass, callback) {
                var result = (user === 'john' && pass === 'doe') ? true : false;
                callback(null, result);
            });

            app.configure(function(){
                app.use("/", auth, function(next) { next(); });
                app.use("/", express.static(__dirname+'/html'));
            });

http.get('http://google.com', function(res) {

                res.setEncoding('utf8');
                var body = '';

                res.on('data', function (chunk) {
                    body = body + chunk;
                });

                res.on('end', function() {
                    cb(body);
                });

            }).on('error', function(err) {
                cb('error', err);
            }); 
4

2 回答 2

4

在向您的服务器发出 GET 后,您需要重组您的应用程序以在回调中完成对 Google 的调用。这是工作代码:

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

// Authenticator
app.use(express.basicAuth('john', 'doe'));

app.get('/', function(req, res) {
    request.get('http://www.google.com', function (err, response, body) {
        res.send(body)
    });
});

app.listen(process.env.PORT || 8080);

如果您想进行更高级的基本身份验证,以下是详细信息:http: //blog.modulus.io/nodejs-and-express-basic-authentication

您似乎正在尝试同步编写代码,但这是行不通的。我建议阅读这篇文章来回顾惯用的 Node:http ://blog.ponyfoo.com/2013/07/12/teach-yourself-nodejs-in-10-steps

于 2013-07-23T04:10:39.607 回答
0

对于 HTTP Basic/Digest 身份验证,您还可以使用http-auth模块

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

// Authentication module.
var auth = require('http-auth');
var basic = auth.basic({
    realm: "Simon Area.",
    file: __dirname + "/../data/users.htpasswd" // gevorg:gpass, Sarah:testpass ...
});

// Application setup.
var app = express();
app.use(auth.connect(basic));

// Setup route.
app.get('/', function(req, res){
    request.get('http://www.google.com', function (err, response, body) {
        res.send(body)
    });
});
于 2016-04-22T10:52:28.770 回答