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

问题描述 投票:0回答:2

问题

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

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

当前想法

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

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

android ios security rest authorization
2个回答
2
投票

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

也就是说,您不能指望在防止访问密钥被黑客攻击方面采取更多措施。然而,您可以做的是将其再次置于您从服务器控制的权限之下。我知道的一种方法是令牌机制。用户发送带有访问密钥及其设备参数的请求。一旦验证通过,您就可以向他返回一个带有过期时间的令牌。有了这个令牌,他就可以访问您的资源。这种方法有两个好处:

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

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

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


0
投票

以下是通过定制的基于 JWT 的方法进行授权的一些想法。

  1. 创建 SHA256 2048 位公钥-私钥对。

  2. 将私钥存储在授权的 Firebase 远程配置上并 您服务器上的公钥。这样,您的 Android/IOS 应用程序代码不会暴露您的密钥。

  3. 创建一个短期到期的 JWT,并使用您的私钥(存储在远程配置中)对其进行签名。

  4. 将此作为请求标头发送。

  5. 您的服务器将通过其公钥验证 JWE 签名,并 到期时间。如果令牌被泄露,那么你可以抛出 未经授权的访问。

主要区别是您的服务器有一个公钥来验证签名。并且您的密钥不会存储在您的应用程序中。

© www.soinside.com 2019 - 2024. All rights reserved.