2016-12-07 107 views
0

我正在使用nodejs,表示 將調用我的api的第三方將使用http:// {username}格式的基本身份驗證: {password}@yourdomain.com/使用nodejs,express和basic auth如何獲得用戶名和密碼

我已經試過

var auth = require('basic-auth') 

app.use(function(req, res, next) { 
    var credentials = auth(req) 
    if (req.headers.authorization) { 
     console.log("found headers"); 
    } 
} 

但是,如果基本身份驗證在頭通過這僅適用。

我似乎無法得到該URL的用戶名和密碼(這是這個外部方可以撥打我的API的唯一途徑)

然後我試過的建議使用URL

這裏是我的現在我看到的時候我做一個POST到

http://myusername:[email protected]:4050/api/callback 


var express = require('express'); 
var http = require('http'); 
var url = require('url'); 

var app = express(); 

app.use(function(req, res, next) { 

    console.log("req.protocol=",req.protocol); 
    console.log("req.get('host')=",req.get('host')); 
    console.log("req.originalUrl=",req.originalUrl); 
} 

http.createServer(app).listen(config.port, function() { 
    console.log("HTTP BandWidth listening on port " + config.port); 

}); 

我的控制檯看起來像

req.protocol = HTTP

req.get( '主機')=本地主機:4050

req.originalUrl =/API /回調

如果我轉儲整個REQ OBJ我沒有看到名爲myUsername或MYPASSWORD

我一定是失去了一些東西明顯

感謝 蘭迪

回答

0

您應該能夠使用內置url包的節點。

https://nodejs.org/dist/latest-v6.x/docs/api/url.html#url_urlobject_auth

const url = require('url'); 

app.use(function(req, res, next) { 
    const urlObj = url.parse(req.protocol + '://' + req.get('host') + req.originalUrl); 
    console.log('Auth info: ' + urlObj.auth); 
} 

希望這有助於!


編輯:嗯,我收回這句話。它看起來像在URI中使用用戶名和密碼已被廢棄,瀏覽器可能會忽略該信息。 See RFC 3986

3.2.1。用戶信息

的用戶信息子可以選擇由用戶名和, ,瞭解如何獲得 授權訪問資源的具體方案的信息。用戶信息(如果存在 )後跟一個商業符號(「@」),該符號將從主機分隔 。

userinfo = *(unreserved/pct-encoded/sub-delims/":") 

使用格式爲:在用戶信息領域的 「用戶密碼」 是
棄用。除非冒號後面的數據爲空字符串
(指示無密碼),否則應用程序不應該在用戶信息
子組件內找到第一個冒號(「:」)字符後顯示任何數據。 應用可以選擇忽略或
當它被接收到的作爲參考
應該拒絕這樣的數據的未加密的形式存儲的一部分拒絕這樣的數據。以明文形式傳遞驗證信息已經證明在幾乎所有使用它的情況下都存在安全風險

而且......

7.5。敏感信息

URI生產者不應提供包含用戶名或密碼的URI,該密碼旨在保密。 URIs經常由瀏覽器顯示,以明文形式書籤存儲,並由
用戶代理歷史記錄和中間應用程序(代理)記錄。 用戶信息分量中出現的甲
密碼已被棄用,
應當認爲是錯誤(或簡單地忽略)除了在那些
少見情況下,「密碼」的參數是打算公開。

我加了粗體和斜體...


這個我試過使用Chrome的開發者工具,得到了以下幾點:

一般

Request URL:http://foobar:[email protected]:8888/test 
Request Method:GET 
Status Code:200 OK 
Remote Address:127.0.0.1:8888 

響應頭

Connection:keep-alive 
Content-Length:19 
Content-Type:application/json; charset=utf-8 
Date:Thu, 08 Dec 2016 03:52:35 GMT 
ETag:W/"13-uNGID+rxNJ6jDZKj/wrpcA" 

請求頭

GET /test HTTP/1.1 
Host: localhost:8888 
Connection: keep-alive 
Pragma: no-cache 
Cache-Control: no-cache 
Upgrade-Insecure-Requests: 1 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8 

所以,它甚至沒有模樣的用戶名和密碼信息被沿鍍鉻過去了。不幸的是,如果你想使用這個模式,我認爲你運氣不好。您可能必須設置授權標頭,設置您自己的自定義標頭(這是我過去所做的),或者將查詢字符串中的憑證傳遞給您。

+0

傑夫謝謝你的幫助,沒有運氣更新錯誤的描述 – randy

+0

@randy見上面... –