2

我在JavaScript(客戶端)和Python/Google App Engine(服務)中編寫Web應用程序,我希望用戶添加他們的數據。我創建了一個歡迎頁面,其中包含登錄/註冊框。輸入正確的用戶名/密碼後,我希望授予用戶權限,然後將其轉發到Web應用程序頁面,並讓用戶使用指定的用戶ID(主機/ {userid}/some_resource)向RESTful服務發送AJAX請求 - 並在服務方面確保用戶獲得授權。如何爲RESTful Web應用程序實現身份驗證?

我該如何做到這一點,並使一切安全(即永遠不會發送明文中的用戶名/密碼)?我發現了一些「流行語」,如「HTTP身份驗證」和「會話」,但無法找到關於如何實現這些事情的可靠和清晰的文章。

我也想知道不同的熱門網站如何處理授權(即GMail通過HTTPS工作; Stackoverflow和Facebook似乎使用HTTP)。

回答

3

我不是一個重新發明輪子的粉絲,所以我建議你或者使用內置的Google帳戶(或OpenID)集成GAE擁有或使用Django用戶認證。

谷歌賬戶/ OpenID的GAE上的Python:http://code.google.com/appengine/docs/python/users/

Django的認證:https://docs.djangoproject.com/en/dev/topics/auth/

這樣,你有你需要管理用戶和Django的,你也可以得到權限框架一切。

+0

我會去Google帳戶/ OpenID,但我需要用戶有獨特的顯示名稱。我可以使用Google帳戶/ OpenID嗎? – Stefan

+0

分配給用戶的唯一標識符。在聯合身份驗證(OpenID)下,Google會將用戶視爲您通過用戶API獲得的任何其他用戶。以下是完整的文檔:http://code.google.com/appengine/articles/openid.html。請注意,此功能仍處於試驗階段。 – Sologoub

+1

@Stefan只要求用戶在首次登錄後選擇顯示名稱。 –

1

基本上你想要的是一個會話。當用戶登錄服務器時,會給他們一個指定系統中的會話或用戶的唯一標記。每當用戶發出後續請求時,他們都會回傳令牌,以便服務器可以檢查它並確保允許用戶做任何他們想做的事情。

在Web應用程序中,您通常在服務器端創建會話並將令牌作爲cookie傳回。用戶瀏覽器會在每個請求中自動將此令牌發送給服務器,以便服務器可以看到用戶已通過身份驗證。這就是Gmail,Stack Overflow和Facebook(以及幾乎每個網站)的功能。

如果你想在GAE上使用cookies,你可以使用內置的Google用戶系統,它會自動創建會話和cookie,你所要做的就是使用用戶API來確定誰登錄(請參閱GAE文檔中的用戶示例)。如果您不想使用Google用戶系統(因爲您不想要求用戶擁有Google帳戶),則可以推出自己的會話系統或使用已建立的庫,例如GAE-Sessions(https:// github .COM /抓住過/ GAE的會話)。在該網站上有一些關於如何使用它的示例代碼。

另外:Web瀏覽器不嚴格使用的RESTful API通常不使用Cookie進行身份驗證。他們爲每個用戶預先創建一個令牌(創建用戶時)或用戶登錄時(將令牌返回給登錄請求的響應),並且用戶在請求中將該令牌返回給服務器,如無論是參數還是HTTP標頭。

在上述兩種情況下,您都可以通過HTTPS和其他HTTP上的操作進行登錄,並且無需額外工作就可以工作,但是從客戶端傳遞到服務器的令牌是通過HTTP發送不安全,這是不好的。很多會話系統會跟蹤會話屬於哪個IP地址,所以如果有人試圖通過複製令牌來劫持會話,他們就無法進入,但除非你有充分的理由不這樣做,否則你應該對所有事情都使用HTTPS。

相關問題