2013-07-22 58 views
2

我有一個nodejs應用程序,它使用express.js中的http基本認證。通過http基本認證(node.js)從應用程序獲取請求

在這個程序中,我向外部網頁發出一個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); 
      }); 
+0

提供一些代碼,請。 – gustavohenke

+0

對於某些頁面/資源,服務器可以允許未經身份驗證的請求。但提供不正確/無效的憑據會導致請求失敗。你可以檢查你的憑證是否正確。 – user568109

回答

4

您需要調整您的應用程序有一個回調裏面做你的谷歌到呼叫,GET頒發給你的服務器了。這裏的工作代碼:

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

看樣子,你要同步編寫代碼,這是行不通的。我建議你閱讀這篇文章中的慣用節點回顧:http://blog.ponyfoo.com/2013/07/12/teach-yourself-nodejs-in-10-steps

0

對於HTTP基本/摘要認證,你也可以使用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) 
    }); 
});