如何仅限授权客户端访问我的REST API?

时间:2015-05-07 06:06:25

标签: android ios security rest authorization

问题

我设计的REST API将用于iOS和Android应用,以及将来可能用于网络和其他移动客户端。

如何将我的整个API仅限制为我想要访问的客户端(应用)?我希望阻止第三方访问我的API以注册用户,甚至无需通过授权应用程序(移动或Web客户端)登录。

当前的想法

我可以为每个客户端提供我想要授权的密钥,但是如何防止从我的应用程序的源代码中提取此密钥(如果我的应用程序是Web应用程序,则特别容易)?此外,如果密钥需要在将来更改(由于妥协),这将很困难,因为我的所有客户端都需要更新,旧客户端将无法运行。必须有一个更好的解决方案。

我使用JWT进行用户身份验证,但我没有看到如何将此问题应用于我的问题。我真的很喜欢JWT如何轻松实现,所以如果我可以应用JWT实现来解决这个问题会很棒。

1 个答案:

答案 0 :(得分:1)

当您在客户端中嵌入访问密钥时,您基本上接受它已被暴露。像proguard和ssl这样的当前技术可以保护它,但它并不能防止坏人以合法的方式滥用它(即通过应用程序)。事实上,在需要用户验证的情况下,这仍然适用。因此,防止滥用只是安全范式的一半。另一半是识别施虐者。

这就是说你不能希望在阻止访问密钥被黑客攻击方面做得更多。但是,您可以在服务器控制的权限下再次对其进行分层。我所知道的一种方式是令牌机制。用户发送带有访问密钥和设备参数的请求。验证后,您将返回一个带有到期时间的令牌。有了这个标记,他就可以访问你的资源了。这种方法有两个好处:

  1. 仍然可以通过设备参数识别用户。根据这些信息和访问频率,您可以决定他是否是施虐者。令牌本身在一段时间后过期,所以如果他是,那么你可以拒绝他下一个令牌。

  2. 您不需要更新访问密钥。

  3. 实际上,这种机制与Amazon Token Vending Machine类似,后者被服务Amazon Cognito取代。