【问题标题】:How do I restrict access to my REST API to only authorized clients?如何限制对我的 REST API 的访问仅限于授权客户端?
【发布时间】:2015-07-17 13:22:00
【问题描述】:

问题

我设计的 REST API 将用于 iOS 和 Android 应用,未来可能还会用于 Web 和其他移动客户端。

如何将我的整个 API 限制为仅允许我想要访问的客户端(应用程序)?我想阻止第 3 方访问我的 API 来注册用户,甚至在未通过授权应用程序(移动或 Web 客户端)的情况下登录。

当前想法

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

我正在使用 JWT 进行用户身份验证,但我看不到如何将其应用于我的问题。我真的很喜欢 JWT 的简单实现方式,所以如果我可以应用 JWT 实现来解决这个问题,那就太好了。

【问题讨论】:

  • 我认为您可以通过在标题中提供密钥来做到这一点。
  • 谁是授权客户?有人知道你的密钥吗?或者您已经验证过的任何人(通过电子邮件、oauth 等)?
  • @inmyth “客户端”是指应用程序,例如网络应用程序或移动应用程序。我不是指用户意义上的客户。这个问题不是关于用户身份验证,而是关于应用授权(“此应用是否有权访问我的 API?”)。
  • @AshokLondhe 我可以在请求的标头中提供一个密钥,但是当将来需要更改此密钥时(由于它被泄露),就会出现问题。 SSL 可以防止此密钥被泄露,但是否存在密钥从移动应用二进制文件或网络应用源代码中泄露的风险?
  • 您找到解决问题的方法了吗?

标签: android ios security rest authorization


【解决方案1】:

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

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

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

  2. 您无需更新访问密钥。

实际上这种机制类似于Amazon Token Vending Machine 被服务Amazon Cognito 取代。

【讨论】:

    猜你喜欢
    • 2019-07-15
    • 2017-10-10
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    相关资源
    最近更新 更多