2015-06-16 306 views
3

以下認證制度似乎合理的:簡單的令牌,如身份驗證

  1. 客戶端調用與到主服務器的用戶名和密碼登錄終點。主服務器將其發送給另一個驗證服務器(將不會再提及),如果這是有效的,並且主服務器知道用戶ID,則返回yes/no。如果是,則生成一個隨機標記(使用一些加密隨機字符串的加密庫),並存儲該標記的哈希值(使用PHP的password_hash()),並在用戶記錄中保存12個小時到期。將令牌返回給客戶端。

  2. 客戶現在向其他終端添加「授權:令牌TOKEN + HERE + ABCD1234」。服務器確保auth頭中令牌的哈希匹配數據庫中的令牌(通過PHP的password_verify()使用salt),並且過期未被命中。如果它不匹配,或者超過期滿,則發回一個401

似乎至少爲基本HTTP認證,這只是具有base-64編碼的用戶爲安全的:在報頭中的密碼?我之所以考慮這個方案是因爲主服務器不會存儲認證服務器用來登錄的用戶名/密碼。

我忘了什麼?這是非常不安全的?

回答

3

你的方案是不是從標準服務器端的會話,其中SESSION-ID通常是一個cookie中沒有什麼比一個隨機令牌和存儲在客戶端不同,有2項改進:

  • 而不是一個cookie,您可以使用授權標頭來傳遞令牌。這起到了CSRF保護的作用。
  • 你會在服務器端散列一個令牌。這有助於防止會話劫持,以防有人訪問服務器端的令牌存儲。
+0

現在查看會話ID。你的回答似乎表明這是一個合理的解決方案,然後呢? – Luke

+1

如果實施正確 - 我沒有發現任何問題。但是請注意,「密碼安全隨機數生成器」實際上不是「一些加密隨機字符串的加密庫」。 –

+0

哈哈指出。文檔似乎表明它具有密碼安全性,但我會確保。乾杯! – Luke

2

如果您看到Google的oAuth流程,那麼您將瞭解Authorization如何爲他們工作。

enter image description here

他們對授權和API調用不同的服務器。用戶將身份驗證詳細信息發送到授權服務器並接收代碼。 Google正在取得用戶同意的過程以訪問詳細信息,但您可以跳過此流程以取得同意並僅在成功的詳細信息中返回代碼。

此代碼可以進一步用於從API服務器獲取訪問令牌。所以你對API服務器的第一個請求就是獲得訪問令牌。谷歌也有能力刷新你的訪問令牌。

所有後續對API服務器的請求都必須包含訪問令牌。所以你似乎錯過了這個代碼交換過程,使它更安全。

更多信息:https://developers.google.com/identity/protocols/OAuth2

+0

該代碼交換添加了什麼? – Luke

+0

@Luke,它會添加兩步驗證。 – Avinash