题
我设计的REST API将用于iOS和Android应用程序,以及将来可能用于Web和其他移动客户端.
如何将我的整个API仅限制为我想要访问的客户端(应用程序)?我想阻止第三方访问我的API以注册用户,甚至无需通过授权应用程序(移动或Web客户端)登录.
目前的想法
我可以为每个客户端提供我想要授权的密钥,但是如何防止从我的应用程序的源代码中提取此密钥(如果我的应用程序是Web应用程序,则特别容易)?此外,如果密钥需要在将来更改(由于妥协),这将很困难,因为我的所有客户端都需要更新,旧客户端将无法运行.必须有一个更好的解决方案.
我正在使用JWT进行用户身份验证,但我没有看到如何将此问题应用于我的问题.我真的很喜欢JWT如何轻松实现,所以如果我可以应用JWT实现来解决这个问题会很棒.
解决方法
当您在客户端中嵌入访问密钥时,您基本上接受它已被暴露.像proguard和ssl这样的当前技术可以保护它,但它并不能阻止坏人以合法的方式滥用它(即通过应用程序).事实上,在需要用户验证的情况下,这仍然适用.因此,防止滥用只是安全范式的一半.另一半是识别施虐者.
这就是说你不能希望在阻止访问密钥被黑客攻击方面做得更多.但是,您可以在服务器控制的权限下再次对其进行分层.我所知道的一种方式是令牌机制.用户发送带有访问密钥和设备参数的请求.一旦验证,你就会给他一个有效期的令牌.有了这个标记,他就可以访问你的资源了.这种方法有两个好处:
>仍然可以通过设备参数识别用户.根据这些信息和访问频率,您可以决定他是否是施虐者.令牌本身在一段时间后过期,所以如果他是,那么你可以拒绝他下一个令牌.
>您无需更新访问密钥.
实际上,这种机制与Amazon Token Vending Machine类似,后者被服务Amazon Cognito取代.