2011-10-20 50 views
0

所以我有一個非常簡單的服務的想法,它將提供一個API,我知道如何在PHP中編寫REST-ish API,但我所做的一切都可以自由訪問。對於這個我希望通過密鑰/祕密對或基本http認證來提供訪問。如何處理用PHP編寫的API的授權

我不知道該怎麼做。

+3

那麼我想你有閱讀的事情要做。 –

回答

7

它通過HTTP頭以某種形式或另一種形式工作。正常的登錄過程通常使用cookie,因此請求標頭Cookie: FOO=owiegwoeugiaweg正在發送,服務器將其發送。你可以對API做同樣的事情,但通常不是最好的做法。

更好的是使用某些頭字段,如Authorization頭某種形式的授權:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== 

這頭可以包含任何你想要的。您可以使用一些自定義密碼散列/密鑰交換/任何算法,並要求客戶端在Authorization標頭中發送此信息。如果你喜歡,你也可以想出自己的任何自定義標題。

對REST驗證請求進行身份驗證的一個好方法是使用請求籤名。該算法由您決定,但至少應包含當前時間,請求主體和用戶特定的密鑰,這些密鑰會一起散列以形成簽名。

headers: 
    Date: Thu, 20 Oct 2011 04:00:48 GMT 
    Authorization: MySchema user123:oiquwetfp32900fjp0q93t1039 

where: 
    Date   = timestamp, must be within 15 mins of server time 
    Authorization = MySchema USERNAME:SIGNATURE 
    SIGNATURE  = sha1(Date + REQUEST BODY + PASSKEY) 

這樣,你基本上發送用戶的每個請求口令,但炒的方式,通過重複相同的操作是不可逆的,唯一的每個請求,但可確定的服務器(檢查有效時間戳,對日期標題+請求正文+用戶的密碼進行散列處理)。曾經有很好的文檔詳細解釋了Amazon Web Services的這個過程,但我現在找不到它。嘗試研究「請求籤名」以獲取更多信息。

在服務器端,您可以在$_SERVER陣列中找到這些HTTP標頭。原始請求正文可以通過file_get_contents('php://input')獲取。

+0

這是一個很好的答案。非常非常感謝你。 – Soska