2013-03-06 67 views
2

我是新手,我想做到以下幾點如何實現的Python REST認證

我有一個像

@login_required 
@app.route('/') 
def home(): 
    pass 

@login_required 
@app.route('/add') 
def add(): 
    pass 

@login_required 
@app.route('/save') 
def save(): 
    pass 

@login_required 
@app.route('/delete') 
def delete(): 
    pass 
  • 我想用戶到用戶的服務端點,同時使這些被認證調用。
    問題
  • 如何使用python驗證REST調用?
  • 如何確保如果調用執行任何端點時,它們都經過身份驗證?
  • 我如何基本上在HTTP標頭級別進行所有身份驗證,而不保存任何狀態,以便將來可以擴展得更好(如同Amazon S3),這意味着任何調用都可能會轉到不同的服務器,並且仍然能夠自我驗證身份。

我對REST世界是完全陌生的,不知道如何實現這一點。

謝謝

+0

你使用任何特定的Python框架? – Ifthikhan 2013-03-06 14:20:24

+0

我會使用Flask,這真的很重要,哪個框架使用? – daydreamer 2013-03-06 14:23:08

+0

不是真的,而是框架的選擇,例如:Flask有助於創建RESTful端點。 – Ifthikhan 2013-03-06 14:36:21

回答

1

安全不適合noobs。使用框架並依賴於它的實現。研究源代碼,閱讀博客和論文,並在某個時候您可以構建自己的系統。

有很多事情可能會出錯,一旦你部署了一個協議,你可能無法在不破壞現有客戶端的情況下回來。

也就是說,認證請求的常用方法是使用一些令牌,通常稱爲公鑰和私鑰(祕密)。一種變體是使用私鑰生成短期會話令牌。另一個變體是使用每個客戶端特定的API密鑰。無論如何,這個令牌通常是通過一個HTTP標頭(標準的cookie或者自定義的)發送的,但是也可以使用請求主體。通常它們不會附加到URL上,因爲密鑰可能會以日誌文件結尾。另外,您應該注意如何以及在哪裏存儲密鑰。

根據通道(普通HTTP),您可能希望使用HMAC來簽署請求,而不是在野外發送祕密。你必須觀察重播攻擊。定時攻擊是可能的。加密衝突可能會被用來打敗你的計劃。您可能需要令牌來避免CSRF(如果Web瀏覽器不起作用,這並不是真的需要,但您沒有指定)

再次,選擇一個框架,不要自己編寫任何代碼。破損的軟件通常可以修復,但安全漏洞可能會造成真正的損害。

0

看看你的API,它看起來不像平靜的端點。 URI應該代表一個特定的實體而不是動作。對於一個實例,如果您正在處理像用戶這樣的實體,您可以使用yourdomain.com/user並執行各種操作,例如使用HTTP動詞(如POST,DELETE,PATCH和GET)進行創建,刪除,更新和獲取(假設您使用這可以很容易地實現燒瓶)。

就安全性而言,我假設有多種方案,但我使用的方案是通過初始身份驗證呼叫爲給定密鑰和祕密的會話令牌生成一個會話令牌。我建議你尋找關於生成密鑰和祕密對以及會話令牌的專門的在線資源。

在擴展方面,我想你的擔心是會話不應該是特定於給定的機器。認證數據可以與HTTP前端分開存儲在商店中。通過這種方式,您可以添加額外的網絡服務器並擴展您的前端或添加額外的數據存儲並根據需要進行擴展。

2

首先,一個問題,您是認證用戶,客戶端還是兩者?

對於認證客戶端,我喜歡HTTP MAC Authentication進行REST服務認證。看看Mozilla Services macauthlib以及它在pyramid_macauth項目中的使用方式。您應該能夠從pyramid_macauth中學習如何使用macauthlib來保護您的服務。查看是否有其他人使用Flask來嘗試此操作也是一個好主意。

要驗證用戶和客戶端,可能需要查看OAuth 2.0(HTTP MAC Auth是一個相關的規範)。

我曾希望發佈更多的鏈接,但是,這是我的第一篇文章,似乎我必須贏得更多的鏈接在我的迴應。 :)