2013-01-24 92 views
0

我正在構建RESTful API,其中一部分將檢查用戶是否擁有有效訂閱。我想這樣做是這樣的:RESTful API檢查用戶是否擁有有效訂閱

GET https://api.example.org/subscriptions/me?username=johndoe&password=abc123&apikey=somekey HTTP/1.1 
Host: api.example.org 
Accept: application/json 

HTTP/1.1 200 OK 
Content-Type: application/json 

{ 
    "username": "johndoe", 
    "id": 5152, 
    "valid": true, 
    "valid_until": "2013-01-01 00:00:00", 
    "account_level": "basic" 
} 

,系統將返回以下狀態代碼:

  • 200用戶是否具有有效的預訂
  • 400如果用戶名或密碼參數被省略
  • 401如果用戶憑證無效
  • 402如果用戶沒有有效的訂閱。
  • 403如果用戶的API密鑰無效
  • 404,如果它是一個無效的用戶
  • 429,如果客戶端已經犯了太多的API請求

這是一個RESTful API設計?它能做得更好嗎?對於無效的API密鑰,HTTP 403是一個很好的迴應嗎?

+0

當您返回錯誤時,您仍可以返回文檔正文中的json數據。通過這種方式,您可以向調用者提供更多詳細信息。 '{code:nnn,message:'無效的API密鑰'}' – slashingweapon

回答

3

我個人會基於用戶的一切。用戶有訂閱。

我建議不要在GET請求中傳遞密碼。沒有人喜歡在他們的歷史中存儲明文密碼。您應該執行POST /登錄並設置適當的會話,以便每次請求都不需要進行身份驗證。如果您希望它完全無狀態,請使用基本的HTTP身份驗證。

請求:

GET /users/5152 
Accept: application/json 
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== 

響應體:

{ 
    "username": "johndoe", 
    "password": "9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890c" 
    "id": 5152, 
    "valid": true, 
    "valid_until": "2013-01-01 00:00:00", 
    "account_level": "basic" 
} 

狀態代碼:

  • 200該用戶是否存在。檢查下標狀態客戶端。
  • 401,如果用戶名或密碼參數省略
  • 401如果用戶憑證無效
  • ---如果用戶沒有有效的訂購。在客戶端
  • 404錯誤,如果用戶不存在
  • 429,如果客戶端已經犯了太多的API請求
+0

我喜歡這個。如果用戶存在但是沒有訂閱,返回402 Payment Required是否不合適? –

+0

是的。這將是不恰當的,因爲如果您將其視爲用戶實體,則不需要付款即可檢索用戶信息。您需要付款以獲得有效的訂閱。如果訂閱無效,它應該是錯誤客戶端。 –

+0

基本身份驗證僅通過HTTPS安全。在普通的HTTP上,您必須使用摘要。 –

0

發送任意用戶密碼的哈希以任何身份驗證的用戶是不是真的是一個好主意。

相關問題