授权 REST 请求

Posted

技术标签:

【中文标题】授权 REST 请求【英文标题】:Authorizing REST Requests 【发布时间】:2010-09-19 09:50:51 【问题描述】:

我正在开发一个有一些要求的 REST 服务:

    它必须是安全的。 用户不应伪造请求。

我目前提出的解决方案是使用如下所示的自定义授权标头(这与亚马逊网络服务的工作方式相同):

Authorization: MYAPI username:signature

我的问题是如何形成签名。当用户登录到服务时,他们会获得一个密钥,他们应该能够使用该密钥对请求进行签名。这将阻止其他用户代表他们提交请求,但不会阻止他们伪造请求。

将使用此服务的应用程序是一个 iPhone 应用程序,所以我想我们可以在应用程序中嵌入一个公钥,我们可以用它来做一个额外的签名,但这是否意味着我们必须有两个签名,一个用于用户密钥,一个用于应用密钥?

任何建议都将不胜感激,我非常希望第一次就做到这一点。

【问题讨论】:

定义“伪造请求”。哪个实体创建非伪造请求?是客户端软件吗? 【参考方案1】:

我认为最简单的方法是使用 HTTPS 客户端身份验证。 Apple 的网站上有关于这个主题的 thread。

编辑:为了处理授权,我会在服务器上为每个用户创建一个单独的资源 (URI),并且只允许该(经过身份验证的)用户操作该资源。

编辑(2014 年):Apple 在过去六年中更改了他们的论坛软件;线程现在在https://discussions.apple.com/thread/1643618

【讨论】:

这如何阻止用户伪造请求? HTTPS 客户端身份验证要求客户端具有有效的公钥证书。除非您所说的“伪造请求”是指经过身份验证的用户以某种方式发出未经授权的请求,否则这是授权问题而不是身份验证问题。 这就是我要解决的问题,我更新了主题以反映这一点。您如何建议授权有效请求? 花 30 秒的时间来追踪原始链接并将其发布在评论或编辑中似乎更具建设性。 @PeterMorris 没什么好讨论的;您忽略了明确说明的反对票的目的,当然我无能为力。你的意图无关紧要。 ***.com/help/privileges/vote-down - “每当你遇到一个非常草率、不费吹灰之力的帖子,或者一个明显不正确且可能非常不正确的答案时,请使用你的反对票。”【参考方案2】:

答案很简单:做不到。一旦您向最终用户提供任何解决方案,他或她就可以随时攻击与之通信的服务器。此问题最常见的版本是在 Flash 游戏中使用高分列表作弊。您可以通过在客户端中嵌入某种加密并混淆代码来使其更难...但是所有已编译和混淆的代码都可以被反编译和不混淆。这只是您愿意为潜在攻击者花费多少时间和金钱的问题。

所以您关心的是不是如何尝试防止用户向您的系统发送错误数据。这是如何防止用户损坏您的系统。您必须设计您的界面,以便错误数据造成的所有损害仅影响发送它的用户。

【讨论】:

在这种情况下,我们将部署到 iphone,因此存在有人反编译代码的风险。您在帖子中提出了非常有效的观点,即限制仅损坏用户数据的能力,在这种情况下,他们能够在游戏中作弊,因此我们需要能够识别作弊者并有效地处理他们。绝非易事。 保护 av 游戏的唯一方法是完全在服务器上运行它,并且只通过网络发送用户操作。我通常做的是: 1. 让作弊变得困难 2. 尽可能多地保存信息。作弊通常很容易被发现,因此您可以在之后删除该用户的所有条目。 如果您正在开发游戏,而这是一个作弊问题,那么您可以使用大量其他工具 - 取决于它是技巧游戏还是机会游戏。一般来说,玩家的表现可以通过统计来衡量,并且可以发现奇怪的模式——这就是娱乐行业中有多少欺诈检测系统起作用。立即想到的另一件事是算法设计,它为游戏引入了某些可测量的属性 - 例如,浮点数中的错误累积。【参考方案3】:

这里有更好的讨论:

Best Practices for securing a REST API / web service

【讨论】:

【参考方案4】:

HTTP Digest Authentication 有什么问题?

【讨论】:

首先我将不得不对请求使用 SSL(这很好),但它不会阻止用户从非 iPhone 设备登录 API 并提交伪造的请求。 他们如何通过摘要认证伪造请求?他们如何获得当前的 nonce 值并创建可接受的摘要响应? 他们可以伪造请求,因为他们可以创建一个登录 api 的 3rd 方客户端应用程序,此时他们可以提交自己的请求。我需要验证api请求的来源。 为什么不能在响应中使用客户端随机数,它是每个 iPhone 独有的签名字符串? 当用户登录时,我们会得到他们的设备 ID,这样可能会起作用。我会对此进行调查,看看我能想出什么。

以上是关于授权 REST 请求的主要内容,如果未能解决你的问题,请参考以下文章

针对 REST API 的授权引发错误:401(未找到请求的凭据。)

Ejabberd OAuth / REST 401 未经授权

具有授权的 Keycloak 自定义 SPI REST 端点

如何管理从本地移动应用程序调用 Play2!-Scala REST 服务发送的用户请求的身份验证/授权

Spring Data REST 中的身份验证和授权

向 Azure Blob 存储发出 GET 请求时授权失败 [REST API][Azure Blob 存储]