【问题标题】:How to handle sensitive properties in a RESTful API (such as passwords, credit cards, etc)如何处理 RESTful API 中的敏感属性(例如密码、信用卡等)
【发布时间】:2013-09-28 23:24:27
【问题描述】:

使用支持多种超媒体类型和身份验证的 REST 框架。我不确定如何处理的一件事是资源中的敏感值。例如,如果我要在 API 中包含用户管理,我需要一种方法向客户端公开密码字段,但不显示实际的密码哈希。信用卡也是一样。如果我不这样做,它将违反超媒体约束,因为领域的知识会变得带外,并使我的 HATEOAS 损坏。

这是我遇到的一个实际用例:

该项目是一个展示人员的目录,以便其他人可以雇用他们。有两种类型的用户:有个人资料的和没有个人资料的。围绕资源的设计将是用户的/users/{userid}/users/{userid}/profile/profile/{profileid},其中将包含一个返回用户的链接,以便客户端可以获得用户名等信息。此外,用户将能够将信用卡存储在/users/{userid}/creditcards/{creditcardid}

要显示用户的个人资料,您还需要用户资源来访问名称等。我们不希望在用户资源或信用卡链接上公开用户密码。我想我可以毫无问题地隐藏信用卡链接,但我不确定密码字段。我应该只为授权用户公开它,而不是在其他用户模型上公开吗?我应该提一下,除非经过身份验证和授权,否则用户只允许使用GET

强调这一点的一个奇怪的极端情况是您可以部分访问更改的对象。假设您是低级别管理员,有权更改用户的姓名和地址,但不能更改密码。由于您无权访问,因此无法公开密码字段。如何对我没有所有字段的资源执行PUT?在这些情况下我应该只使用PATCH 吗?

TL;DR:如何在 REST API 中正确隐藏/公开字段并遵循超媒体约束?

【问题讨论】:

    标签: api rest authorization api-design hateoas


    【解决方案1】:

    首先,当有敏感信息时,请始终使用 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

    【讨论】:

      猜你喜欢
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多