2011-02-08 68 views
2

我正在構建一個允許用戶創建,編輯和保存文檔的web應用程序。用戶帳戶的數據庫是分開控制的,我已經提供了一個SOAP API,它會告訴我一個給定的用戶名/密碼是否有效。如何通過第三方API安全地維護用戶身份驗證?

假定用戶名/密碼有效,則API將會給我回了以下信息:
•電子郵件地址
•用戶名
•login_number(該帳戶唯一ID,似乎是一個自動遞增INT )

我會將我的應用程序的數據存儲在我自己的數據庫中,所以我可能會使用login_number將數據綁定到單個用戶。

我的問題是,一旦用戶成功登錄後,我應該如何跟蹤用戶。將login_number存儲爲cookie可能會起作用,但似乎對我來說會非常不安全。我正在考慮一些存儲某種隨機哈希的cookie,並在查找表中存儲該哈希和相關的login_number,但我不確定這是否足夠。

標籤爲PHP/MySQL,因爲這是我計劃使用的後端,但不確定這對於這個問題確實很重要。

回答

0

這是非常普遍的情況下,任何開放的身份驗證以Facebook oAuth 2.0爲例。一旦用戶同意你的條款,Facebook提供了他的用戶名,電子郵件,以及在任何時候檢查用戶是否仍然登錄的方式。

因此,有幾個方法:

  1. 依靠提供商:如果基於用戶ID的SOAP API提供了用戶是否登錄或沒有的信息。您可以在執行任何需要驗證的任務之前使用此調用。

  2. 在SOAP API上構建您自己的身份驗證:我猜這就是您計劃要做的。該方法是使用加密/哈希和難以重新創建的令牌。
    這個想法是這樣的

    (a)只要用戶登錄創建一個唯一的標記,將該標記保存在用戶的會話或某個永久存儲中。可能在memcache中或用userId映射的地方。基本上,無論您何時可以檢索該令牌,都知道哪個用戶與其關聯。

    (b)將此令牌存儲爲cookie。 (c)無論何時需要進行身份驗證,都可以使用cookie中的令牌與保存在用戶會話中的令牌進行匹配(或者拉出與令牌匹配的userId,並將當前userId與使用令牌拉取的userId匹配進行驗證)。

    (d)在註銷時刪除cookie。

    現在,有很好的機會man-in-the middle附加這種方法。

    一種方法是昂貴的,即在每個請求結束時更改令牌。這並不能消除MITM的攻擊,但攻擊的機率相當渺茫。

希望這會有所幫助。


杜撰現時的想法很簡單,很紮實。但我不確定它會適用於您的情況。它基本上是保護SOAP調用。 AWS使用類似的東西。

  1. 向客戶提供secretKey
  2. 每當cient提出請求時,他必須將當前時間戳的散列值與secretKey(說它是token)以及它用於創建token的時間戳一起傳遞。
  3. 服務器將tokentoken與服務器創建的哈希值進行比較,服務器使用時間戳在頭中傳遞並將secretKey存儲在服務器端的其他位置,可以在數據庫中將其作爲password或secretKey。
  4. 如果令牌匹配,則允許用戶訪問,否則不允許。
  5. 還有一件事,如果時間戳與服務器當前時間戳太差,服務器也可能會取消訪問。

這種方法實際上是免費的MITM攻擊,但不知道這是否是最適合您的方法。

客戶端服務器對話看起來這

client ----request timestamp       --------> server 
     <---current timestamp       -----------' 
--- {ts: timestamp, token: Hash256(timestamp, secretKey)} --> isEqual(token, hash256(ts, secretKey)) 
                   | | 
             Access Denied<- false/ true --> ACCESS 

@kramthegram感謝提醒杜撰

+0

樣的改變現時防止中間人攻擊的人,只要你不重複的隨機數和更改它與每個請求。不過,我認爲在註銷時改變已經足夠了。 – cmaynard 2011-02-08 20:14:10

0

您可以嘗試使用基於nonce的會話來散列用戶號碼。將該cookie設置爲在登錄超時時間(例如30分鐘)時過期。隨機會話隨機數將有助於防止惡意用戶可以複製Cookie以獲得訪問權限的回放攻擊,因爲每個會話都具有時間敏感的散列。

相關問題