api - 如何处理 RESTful API 中的敏感属性(例如密码、信用卡等)

标签 api rest authorization api-design hateoas

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

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

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

要显示用户的个人资料,您还需要用户资源能够访问名称等内容。我们不希望在用户资源或信用卡链接上暴露用户的密码。我想我可以隐藏信用卡链接,没有任何问题,但我不确定密码字段。我应该只向授权用户公开它,而不是向其他用户模型公开它吗?我应该提到的是,除非经过身份验证和授权,否则用户只允许 GET

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

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

最佳答案

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

关于api - 如何处理 RESTful API 中的敏感属性(例如密码、信用卡等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19072759/

相关文章:

.net - Angular JS 将带有 $resource 的数组数据发送到 .NET API

java.lang.RuntimeException : Unable to instantiate @Form class. 没有无参数构造函数

authentication - 跨微服务授权与认证

django - 如何解决此错误 "' password_reset' 不是 rest api django 中的注册命名空间”

rest - 如何在 REST 服务中命名自定义端点

asp.net-core - RequireAuthorization 和 Swashbuckle IOperationFilter

c# - 自定义基于角色的授权(无成员(member)资格)

node.js - Nodejs 登录 api null 检查歧义

Java 代码 API 存储库

javascript - 哈皮,错误 415 : Unsupported Media Type error