我剛剛開始構建API,我無法理解如何合理執行以下任務。授權訪問REST API中的資源
有一個端點:
/用戶/ {USER_ID}
以檢索用戶的詳細信息。 前端代碼將請求此端點獲取有關要在儀表板上顯示的用戶的詳細信息。 我必須保護此端點,以便不表示此user_id的用戶模擬請求以獲取有關其他用戶的信息。
由於基於REST的API是無會話的,因此我無法存儲會話密鑰。那麼,如何確保服務器僅在用戶標識的所有者請求時發送用戶信息?
我剛剛開始構建API,我無法理解如何合理執行以下任務。授權訪問REST API中的資源
有一個端點:
/用戶/ {USER_ID}
以檢索用戶的詳細信息。 前端代碼將請求此端點獲取有關要在儀表板上顯示的用戶的詳細信息。 我必須保護此端點,以便不表示此user_id的用戶模擬請求以獲取有關其他用戶的信息。
由於基於REST的API是無會話的,因此我無法存儲會話密鑰。那麼,如何確保服務器僅在用戶標識的所有者請求時發送用戶信息?
你說得對。 HTTP是一種無狀態協議,因此REST也繼承了這種質量。
這裏是簡單的話交易。
[REST客戶] -------> [API端點]
你有很多REST客戶端,你需要確保只有授權的用戶將授予訪問您的API端點。 @James建議的一種解決方案是使用令牌機制,如JWT https://tools.ietf.org/html/rfc7519。
如果考慮JWT認證,流程將如下。
[REST客戶] -------> [AA服務] -------> [API端點]
您將需要一個AA (授權,認證)服務。例如,在微服務方法中,這可以從API網關執行,該網關是所有服務的入口。
客戶將AA服務的用戶名和密碼。作爲交換,AA服務將爲客戶提供一個僅由服務器簽名的JSON令牌,以保護機密性。這個令牌包含3件事情。
頁眉指定用於簽名
有效載荷喜歡誰令牌發行,其中包括索賠的令牌和算法類型時,應令牌到期,什麼是發行用戶的角色應該是等(見https://tools.ietf.org/html/rfc7519#section-4)
簽名,其通過所述服務器密鑰簽署簽名令牌的產物
然後,你編碼具有base6每個報頭,有效載荷,簽名4和concatanate與「。」。你現在有一個智威湯遜。
之後,對於每個後續REST調用,客戶端應該包含收到的令牌,最好是在授權頭中,儘管技術上也可以在消息有效載荷中發送令牌。
然後AA服務的責任是使用其簽名密鑰評估JWT中的聲明來解密令牌,並根據是否授權API調用向他發送HTTP 401,403響應。
如果您使用jwt令牌,那麼user_id不需要傳遞因爲令牌可以識別用戶本身。您可能需要更改API。 –
不一定。用戶ID仍然需要傳遞給其他服務以進行查詢。例如,論壇服務需要特定的用戶ID來列出他的回答/評論的帖子或評論。通知服務可能需要用戶標識才能向特定用戶發送通知。但是沒有必要以JWT的形式發送用戶標識。 –
使用[token authentication](https://stormpath.com/blog/token-authentication-scalable-user-mgmt)。 – James
更廣義的答案將在這裏https://stackoverflow.com/questions/7551/best-practices-for-securing-a-rest-api-web-service?rq=1。您可以考慮JWT(Json Web Tokens).https://medium.facilelogin.com/jwt-jws-and-jwe-for-not-so-dummies-b63310d201a3 –