2014-07-10 33 views
0

我想在CakePHP API中使用基本身份驗證,我可以使用jQuery進行交談。基本身份驗證不是無狀態

運行這段代碼工作正常:

$.ajax({ 
     type: 'GET', 
     url: 'http://username:[email protected]', 
     dataType: 'jsonp', 
     success: function(data) { 
       console.log(data); 
     } 
}); 

注:我把用戶名和密碼的網址,否則頭不會使用JSONP作爲數據類型,然後使用beforeSend等發送

然而,然後運行該代碼,作爲上述一更換後運行上面也適用(請注意,我不發送用戶名和密碼了)

$.ajax({ 
     type: 'GET', 
     url: 'http://domain.com', 
     dataType: 'jsonp', 
     success: function(data) { 
       console.log(data); 
     } 
}); 

瀏覽器記住用戶,所以代碼不再需要頭文件向CakePHP API發出請求。但如果它是無狀態的......這不應該是正確的?

我以爲你必須將每個請求的標題發送到基本認證?

任何人都可以解釋這一點嗎?

回答

0

應該使其無狀態纔有意義在API的形式,但這不是強制性通過標準爲基本認證可以與正常的請求被用來獲得通過瀏覽器訪問受保護資源。

就像在正常的身份驗證中一樣,你的代碼可能會設置一個會記住用戶的會話以用於後續請求。查找cookie響應或添加完整的代碼。

另請注意,基本身份驗證和http(無SSL)與災難相匹配,因爲憑據將作爲未加密請求的一部分發送。

+0

您如何使CakePHP的基本身份驗證無狀態?因爲我的印象是,這不是會議(我已禁用)的情況,而是其他事情。 – Cameron

0

在第一次請求期間,服務器實際在響應頭中發出WWW-Authenticate字段,並響應您的請求認證,要求您輸入正確的用戶名和密碼。在你的情況下,你將它們包含到URL中。

當您下一次再次向服務器發送請求時,客戶端的請求頭現在會包含授權字段(即Authorization: Basic c2RmZ2RmZzpkYWRmZHNmcw==)。 c2RmZ2RmZzpkYWRmZHNmcw==基本上是一個基本的64位編碼字符串,客戶端將這些字符串包含到每個後續請求的標頭中,以便服務器不會每次都使用質詢驗證進行響應。通過對字符串進行64位解碼,您將看到該值基本上是<username>:<password>格式的用戶名和密碼(即dfgdfg:dadfdsfs)的組合。

現在,如果您嘗試關閉瀏覽器,則授權字段將被銷燬,並且一旦您嘗試再次發出請求,服務器就會再次詢問正確的用戶名和密碼。實際上,您可以繞過在純文本中包含用戶名和密碼的URL。只需在請求標題中包含一個Authorization字段。只要確保:value值是64位編碼正確的,並且包含Basic就可以了。

+0

但是,如果我刷新頁面,以前的請求應該被遺忘的權利?否則,這不是無國籍的。基本身份驗證應該是無狀態的。 – Cameron

+0

HTTP是無狀態的,這就是客戶端需要一次又一次發送授權HTTP頭字段的原因。 –

+0

但是,爲什麼它發送它,如果它不在JS代碼?即記住授權用戶。 – Cameron