簡體   English   中英

在PHP中實現身份驗證API

[英]Implement authentication API in PHP

我有一個現有的Django應用(D),我想與一個PHP應用(在不同服務器上的P)連接以進行身份​​驗證。 也就是說,用戶登錄到D,后者在P上調用服務以檢查其密碼。 他們還需要最終擁有一個本地用戶帳戶,並將有關他們的屬性存儲在D中。實際的安全要求非常低。 D很難直接訪問P的數據庫。

從來沒有實現過任何身份驗證,我在想這樣的事情:

  1. D:收集用戶名和密碼,計算哈希(使用與P相同的算法)
  2. D:在P上調用網絡服務(HTTP),傳遞用戶名和哈希
  3. P:查找用戶名,如果不存在則失敗。
  4. P:如果是這樣,請對照傳遞的哈希值檢查存儲的哈希值,如果不同則失敗。
  5. P:如果可以,請返回有關用戶的其他信息(例如,全名,某些特定於域的資料),否則返回失敗
  6. D:如果可以,請創建/更新用戶記錄
  7. D:如果可以,請登錄。

因此,有幾個問題:

  • 這種方法明智嗎? 它容易受到什么攻擊(通知客戶端...)?
  • 您怎么稱呼在P:身份驗證提供者處添加的功能?
  • 使用標准協議,或者至少使用Web服務調用名稱,是否有更標准的方式來完成這些工作?
  • 步驟6是否合理? 以這種方式同步用戶數據庫有不利之處嗎?

由於您已經提到兩個服務器都在同一機構/網絡中,因此只要您使用HTTPS而不是純HTTP,身份驗證就可以工作。

D: Collect username and password, compute hash (using same algorithm as P)

除非您可以確定PHP哈希與Django哈希相同,否則我建議您通過(但不能通過純HTTP,請參見第2點)發送密碼。

Call web service (HTTP) on P, passing username and hash

僅在絕對確定兩個服務器直接連接時,才應使用純HTTP。 否則,您很容易受到典型的Web攻擊(例如,中間人)的攻擊,在這種攻擊中,您會清楚地傳輸(散列)密碼。 我假設在PHP應用程序端,您正在直接驗證哈希值是否相同。 如果不確定網絡狀況,請確保您正在通過HTTPS調用Web服務。

P: Look up username, fail if it doesn't exist.
P: If it does, check stored hash against passed hash, fail if different.
P: If ok, return some other information about the user (eg, full name, some domain-specific stuff), otherwise return fail
D: If ok, create/update the user record
D: If ok, then log them in.

這些步驟很好,但是如果要在兩個數據庫之間尋求持續的用戶同步,則需要找到一種更新自己的用戶數據庫的方法。 如果PHP應用程序禁用/刪除了用戶,則Django應用程序需要獲取該更改,否則您仍將允許已刪除的用戶在Django端登錄。

有兩種方法可以解決此問題:

  1. 每隔X分鍾/小時輪詢一次,以驗證用戶狀態是否相同
  2. 使用消息傳遞系統(例如RabbitMQ),以便PHP端的所有更改都將在Django端發布和接收。

第一種方法比較簡單,但效率和安全性卻不高,因為用戶仍可以在下次輪詢之前登錄Django。 如果安全性不是至關重要的,並且用戶數量很少,則建議這樣做。

第二種方法更好,但是您將不得不編寫更多代碼來管理同步(PHP和Django)。 這種方法要好得多,因為您幾乎可以立即跟蹤PHP應用程序中的用戶更改並將其反映在您自己的數據庫中,如果用戶不使用Django應用程序,則可以忽略PHP端對用戶的更改(因此,記錄在您的身邊)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM