2013-02-28 127 views
1

所以我正在嘗試儘可能地實現我正在構建的這個API的OAuth 2。我處於需要生成access_token的位置,但我正在試圖找出這樣做的最佳方法。我讀過一個人們正在加密revenant信息和access_token(如過期日期,客戶端ID等)的地方,以防止在每個API調用中查找數據庫。使用什麼來生成OAuth 2訪問令牌

我想到了這一點,並認爲,如何生成access_token句柄撤銷訪問?我的意思是使用OAuth的好處之一是能夠撤銷應用程序對數據的訪問權限,如果我只是在沒有在數據庫中查找的情況下使用加密數據,如果我撤消應用程序,它仍然有權訪問到我的數據,直到至少access_token過期。

我認爲更好的方式來防止在關係數據庫中查找也會將access_token存儲在鍵/值數據庫(如redis)中,因爲這樣會更快一些。這樣,如果有人撤銷對應用程序的訪問,它可以刪除關係數據庫中的記錄以及鍵/值數據中的記錄。

我思念的東西,有沒有使用加密數據到的access_token,防止數據庫查找每個API調用,並因爲能夠隨時撤銷訪問的方法嗎?

回答

1

你已經知道了兩種方法(數據庫中的令牌和獨立令牌)的優點和缺點,這是你必須做出的選擇。大多數供應商需要自給式令牌,我建議同樣作爲一個起點,例如JWS/JWE。然而,我認爲你可以稍微調整一下它,並將兩個世界中最好的一個與一個簡單的技巧結合起來(我猜大多數提供者可能都這樣做),而不是簡單的自包含的令牌。考慮到令牌撤銷特殊情況(至少比普通令牌操作少得多),您可以在數據庫中僅保留已撤銷令牌的列表。驗證令牌,您可以在撤銷令牌列表中搜索令牌:如果未找到,則可以將其簽名或加密的內容用作正常使用。這樣你仍然擁有一個數據庫,但是記錄數量更少,查找速度更快。例如。您只能使用您的鍵/值數據庫,而不能同時使用鍵/值和關係數據庫。如果您不希望API佔用大量流量,那麼您甚至可以通過將撤銷令牌列表保存在內存中來保存整個數據庫查找。無論如何,它們會在到期後周期性地將它們從清單中清除。

+0

有趣。我想我仍然需要在數據庫中保留所有的令牌(仍然需要保留數據庫中的所有有效令牌,以便能夠撤銷它們),但將它們放在單獨的表中以加快查找速度會很好。 – ryanzec 2013-03-04 15:59:24

+0

由於授權代碼和訪問令牌過期非常快(即幾分鐘內),因此您可能不需要撤銷它們。因此,您也可以選擇僅保留數據庫中的有效刷新標記列表,並在撤消時從列表中刪除。您仍然可以使用獨立代碼和不需要列出的訪問令牌節省大量數據庫空間和搜索成本。 – 2013-03-04 16:20:37

相關問題