2013-09-28 60 views
3

使用支持多種超媒體類型和認證的REST框架。我不確定如何處理的一件事是資源中的敏感值。例如,如果我要在API中包含用戶管理,我需要一種向客戶端公開有密碼字段但未顯示實際密碼哈希的方式。與信用卡相同的東西。如果我不這樣做,它會違反超媒體約束,因爲這些字段的知識會超出範圍,並且會破壞我的HATEOAS。如何處理RESTful API中的敏感屬性(例如密碼,信用卡等)

下面是我遇到的實際使用情況:

該項目的人的一個目錄,展示他們讓其他人可以聘請他們。有兩種類型的用戶:具有配置文件的用戶和沒有用戶的用戶。圍繞資源的設計將是/users/{userid}爲用戶和/users/{userid}/profile/profile/{profileid}這將包括一個鏈接回到用戶,使客戶端可以得到的東西,如用戶的名字等。此外,用戶將能夠存儲信用卡在/users/{userid}/creditcards/{creditcardid}

要顯示用戶的配置文件,還需要用戶資源才能訪問名稱和內容。我們不想要的是在用戶資源或信用卡鏈接上公開用戶的密碼。我想我可以隱藏信用卡鏈接,沒有任何問題,但我不確定密碼字段。我應該只將它公開給授權用戶,而不公開給其他用戶模型?我應該提到,只有GET被允許在用戶身上,除非經過認證和授權。

一個會強調這一點的奇怪邊緣案例將是您可以部分訪問更改的對象。假設您是低級別的管理員,可以訪問更改用戶的姓名和地址,但不是密碼。由於您無權訪問,因此無法公開密碼字段。我如何才能將PUT添加到我沒有所有字段的資源?在這些情況下,我應該只使用PATCH嗎?

TL; DR:我如何正確地隱藏/暴露REST API中的字段並遵循超媒體約束?

回答

0

首先,當存在敏感信息時總是使用SSL。如果您使用SSL,您的請求將被加密。甚至URL也通過網絡加密。但是,還有許多其他地方可能以明文形式記錄這些相同的URL(例如代理服務器,負載平衡器,DNS服務器),因此不要在URL中放置任何敏感信息。

那麼這對您的REST API意味着什麼?那麼,首先,不要在ID中使用敏感信息。您的信用卡號碼可能是唯一的,但不要將其用作卡的標識符。

另外,獲取資源時永遠不會返回密碼。您應該在服務器上過濾這類信息。您可以在請求主體中接受它,但不應將它發送迴響應主體。

對於其他奇怪的邊緣情況,PATCH還不是標準。在成爲一個之前,我已經看到很多使用POST的人進行部分資源更新。 POST不一定是冪等的,所以它實際上很有意義。所以,POST是部分更新,PUT是在給定的ID處創建或替換。聽起來不錯?

如果你還沒有看過Les Hazlewood在HATEOAS上的演講,我建議你這麼做。它給出了最佳實踐的相當好的概述。

http://www.youtube.com/watch?v=mZ8_QgJ5mbs

相關問題