2010-01-07 122 views
8

嘿夥計們,這似乎一直在討論相當頻繁,但我想做一個簡單的,淡化的問題圍繞使用RESTful服務進行身份驗證。場景如下:RESTful用戶認證服務

  • 有一個系統,爲註冊用戶提供一個應用程序。系統公開用於訪問這些用戶的RESTful API。
  • 有一個具有登錄表單的前端應用程序。應用程序可以是內部的,也可以是外部的。
  • 前端應用程序需要使用用戶系統中的數據來認證用戶。現在

的問題是如何將其憑據(用戶名/密碼),在用戶系統中,使得它的安全性和高性能的針對數據的客戶端應用程序中輸入驗證用戶的身份?爲了這個問題,假設客戶端應用程序在某種Intranet內部,但應用程序不會駐留在同一臺機器上,並且只能通過服務進行通信。

我明白應用程序是「超媒體驅動」的想法,但我們應該能夠提供過濾/搜索服務。例如,考慮資源和如下API:

  • http://example.com/users
    • GET - 檢索所有用戶(分頁,超媒體驅動)
    • POST - 創建新的用戶
    • PUT/DELETE不支持
  • http://example.com/users/[id]
    • GET - 返回與ID = {ID}
    • PUT用戶的完整表示 - 更新用戶,需要在任何預定義的媒體類型
    • 刪除 - 刪除用戶(具有適當的授權)不支持
    • POST

基於上述,我的想法是在客戶端應用程序中獲取用戶列表,通過用戶名進行過濾。該服務將把散列的密碼和salt返回給客戶端,客戶端將執行認證。

想法?

+1

你能更具體地說明問題是什麼嗎?我很難理解你想要什麼樣的反饋。 – 2010-01-07 05:38:38

回答

3

首先,您不希望客戶端執行身份驗證,因爲寫入客戶端可能會影響您的服務。

相反,只需使用HTTP BasicHTTP Digest等驗證機制即可。

請注意,如果您使用的是Java,Restlet框架提供攔截器,稱爲Guards,它支持這些和其他機制。我強烈推薦Restlet。

6

如果我正確理解你的問題,你正在尋求實現一個通用服務來處理身份驗證,以便你可以重用它用於不同的應用程序。

我建議你看看OAuth,它已經爲這個問題領域而精心打造。

4

傳遞用戶名和鹽返回是不必要的,並且是一個真正的安全風險。

也許你可以考慮這個方法:

已在客戶端通過Basic Authentication

傳遞到服務器的用戶名和密碼的服務器一起室內用的鹽

獲取用戶名的加密密碼服務器使用一些加密方法加密給定的密碼,使用鹽來協助算法(Ruby代碼如下):

def User.authenticate(login, password) 
    ok = false 

    user = User.find_by_login(login) 

    if user 
     # 
     # user contains the salt, it isn't passed from the client 
     # 
     expected_password = hash_password(password, user.salt) 

     ok = (user.password == expected_password) 
    end 

    return ok 
end 

有很多地方可以使用這種方法,但我喜歡在Rack中完成。

末點,做這一切HTTPS連接

0

Mozilla的假面

因爲這個問題被張貼,在Mozilla Foundation(在該Firefox瀏覽器的製造商)已經採取了簡單的用戶身份驗證的問題上。他們的解決方案是Mozilla Persona,「Web的登錄系統」。旨在方便開發者的用戶。用戶的身份是一個電子郵件地址。見Wikipedia article

更新

Mozilla已經基本放棄工作的假面,但not quite killed項目。

4

Stormpath

Stormpath公司致力於爲開發者提供用戶登錄管理API和服務。他們使用RESTJSON的方法。

還有一些公司似乎涉足這個新的認證即服務領域,但Stormpath是我所知道的唯一一個專注於此的領域。