2014-09-25 124 views
1

我目前正在使用GrapheneDB來處理我的Neo4J數據庫,我從我的Ember應用程序中提取信息。 Neo4J需要基本的HTTP身份驗證,因爲我想要一個更安全的方法(而不是明確地在我的ajax調用中聲明頭文件),我試圖使用http代理連接到數據庫。所以通過Ember-CLI,我在'/ api'處生成了一個具有路徑的http代理。在代理文件,我有以下幾點:Ember-CLI - 在HTTP代理服務器上設置HTTP授權頭

〜/服務器/代理/ api.js

var proxyPath = '/api'; 

module.exports = function(app) { 
    // For options, see: 
    // https://github.com/nodejitsu/node-http-proxy 
    var proxy = require('http-proxy').createProxyServer({}); 
    var path = require('path'); 


    app.use(proxyPath, function(req, res, next){ 
    var credentials = new Buffer('app-id:app-pw').toString('base64'); 
    // include root path in proxied request 
    req.url = path.join(proxyPath, req.url); 
    req.headers.authorization = "Basic " + credentials; 

    proxy.web(req, res, { target: 'http://app-id.sb02.stations.graphenedb.com:24789/db/data/' }); 
    }); 
}; 

所以當上面跑,當服務器上打印出來的標題似乎是正確的:

{ host: 'localhost:4200', 
    connection: 'keep-alive', 
    'cache-control': 'max-age=0', 
    accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 
    'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36', 
    'accept-encoding': 'gzip,deflate,sdch', 
    'accept-language': 'en-US,en;q=0.8', 
    authorization: 'Basic <correct base64 hash>' } 

但要到我的API URL的時候,我得到下面的請求頭:

GET /api HTTP/1.1 
Host: localhost:4200 
Connection: keep-alive 
Cache-Control: max-age=0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 

我得到了404 Not Found。但是當我刪除授權標題時,我得到一個401 Unauthorized提示我輸入用戶名/密碼。有時在頭上會顯示:「Authorization:Basic Og ==」。無論哪種方式,它不起作用。

有沒有人知道這個解決方案?我嘗試了node-http-proxy文檔中的示例setHeader代碼,並且還在整個interwebs上搜索了關於ember http-proxy的信息,但無濟於事。先謝謝了!

回答

2

我只是吐痰在這裏,因爲我無法測試這個,但我認爲你有它的工作。你得到一個404,因爲你要求'http://app-id.sb02.stations.graphenedb.com:24789/db/data/api'這可能不存在。這也可能是因爲接受標題。如果你在瀏覽器中試用它,那麼accept頭是text/html,但是你的目標可能期望application/json在這種情況下是404s。你可以嘗試捲曲它來測試'curl -H「ContentType:application/json」[target]「。

+0

感謝您的回覆GOULETGOULET,看起來你是對的。我沒有做CURL,而是迅速通過刪除標題進行檢查,然後在網站提示時手動登錄。並確定它登錄後的404。是否http-proxy總是在目標URL前加上前綴「/ api」?因爲Neo4J帶有一個可以直接訪問的瀏覽器,它將是http://app-id.sb02.stations.graphenedb.com:24789/browser,但更改爲此目標URL也是404的。我的設置有什麼根本性錯誤嗎? – 2014-09-26 17:30:12

+0

明白了!這是你提到的附加/ api。我沒有線索被添加到網址中。非常感謝! – 2014-09-26 17:55:02

0

正如GOULETGOULET所述,'/ api'被追加到目標URL的末尾,並且我的目標中不存在這樣的目錄。所以將它交換到'db/data'就行了。