2012-04-13 100 views
10

我正在爲移動應用程序設計一個API,並且我希望將它保持爲RESTful。
API的授權使用Basic HTTP Auth,但是,當用戶第一次打開應用程序時,他需要先登錄,所以我需要設計一個API來檢查用戶的憑據,它將接受一對用戶名和密碼密碼,返回成功或相應失敗。
問題是什麼網址應該是這樣,它是寧靜的?我不認爲/登錄是一個好的。如何設計一個RESTful API來檢查用戶的憑據?

回答

6

一個好方法是對當前用戶的帳戶/資料信息執行GET請求。並讓它返回用戶名,設置,頭像網址等。me是經常用作認證用戶的簡寫標識符。

GET https://api.example.com/profiles/me 
HTTP/1.1 200 OK 
{ 
    "username": "bob", 
    "id": "xyz", 
    "created_at": 123, 
    "image_url": "https://example.com/bob.png" 
} 
5

維基百科:

的客戶機 - 服務器通信由沒有客戶 上下文進一步限制被存儲請求之間的服務器上。來自 的每個請求都包含爲服務 請求所需的所有信息,並且任何會話狀態都保留在客戶端中。

因爲服務器存儲從客戶端沒有會話狀態,你的API 應該不會暴露任何登錄/註銷功能:在每一個要求,你應該發送用戶憑據,服務器應該每次都驗證它們。

檢查this discussion in SO,它克服了這個概念。

0

我同意卡洛斯 - 在一個正常的寧靜的API中,沒有會話,所以你不能驗證一次然後重新使用會話,你實際上需要在每次調用時都傳遞憑據集(不理想)。

在這種情況下,它聽起來像你會更好地使用openAuth(http://www.oAuth.net)之一 - 這是通過驗證應用程序第一次運行時的身份驗證,然後生成訪問令牌以允許在每次通話中訪問(+刷新令牌)。

(你可能會認爲訪問令牌是狀態 - 它的類型 - 但是,至少它通常會長得多)。

+0

是的,我在每次通話時都通過了憑證設定,但是我確實需要登錄才能檢查用戶的憑證,當他們第一次打開應用程序 – wong2 2012-04-14 08:45:01

+0

時,我沒有保留會話cookie或任何類似 – wong2 2012-04-20 12:55:57

+0

好的 - 所以我想你必須通過憑證*用戶名/密碼*每個電話是正確的。你要麼總是要傳遞它,要麼傳遞一次會話。 – steve 2012-05-28 20:51:53

6

它通常被認爲是不好的做法,通過HTTP GET請求通過敏感數據

密碼信息是敏感數據,是破壞idempotent operations應該是GET請求的規則之一。

爲什麼這是一個例外?瀏覽器歷史記錄和服務器日誌將存儲GET請求。這意味着這兩個地方的敏感信息在純文本中都是可見的。所以,如果有人得到任何一個 - 那麼這些信息現在掌握在他們手中。

您應該使用HTTP POST請求將此敏感信息傳遞給RESTful API,因爲瀏覽器不會存儲它們,並且服務器不會記錄它們。但是,第一道防線是使用安全HTTP(HTTPS)來確保這些信息不受外界的干擾。

因此,將此信息通過HTTP請求的正文傳遞給HTTPS URL。

0

GET https://api.example.com/auth

隨着授權報頭組。