【问题标题】:How to Secure an API Call made from a mobile application without username/password?如何保护从没有用户名/密码的移动应用程序进行的 API 调用?
【发布时间】:2015-08-23 05:38:20
【问题描述】:

我购买了一个可以在移动应用程序中使用的 API。 API 包含预期的密钥和用户名。 在应用内,需要在付款确认时调用此 API。

我发现使用 Fiddler 之类的工具,可以看到应用程序发出的请求。如果是这种情况,只需几秒钟即可完全访问 API 签名。

如果有人可以帮助/添加这个问题,那将是非常有帮助的。

我的想法:

  1. 使用服务器进行此 API 调用,而不是直接调用它 来自应用程序。
  2. 如果使用服务器,问题仍然存在,因为对服务器的 API 调用(最终调用购买的 API)也可能被中断/访问
  3. 如何保护应用程序对服务器的调用?

技术:Angular JS、Node JS、Ionic 框架

【问题讨论】:

  • 这是一个相当广泛的问题,但您的想法#1 是正确的:如果您从 不可信 客户端发出请求(Angular 等前端框架属于此类),您不能发出会损害您的凭据的 API 请求。一种解决方案是在您的服务器上使用像 OAuth 这样的方案来向客户端授予访问令牌,当然,您的所有私有 API 请求都只来自您的服务器。
  • @NateBarbettini 感谢您的快速回复。我将检查 OAuth。不过,我有一个小问题,即使不涉及用户概念,OAuth 是否有用?我的意思是,该应用程序旨在使用没有登录功能。唯一需要检查的是 API 调用是否确实来自已安装的应用程序。
  • @user5256499:在这种情况下,应用就是用户。

标签: angularjs node.js api security server


【解决方案1】:

看看我对this问题的回答。除了使用用户名和密码,您的后端可以提供额外的资源,允许用户创建具有特殊范围的令牌。 在您的 AngularJS 应用程序中,您可以使用 $http 或 $resource 服务(如果包含 ngResource 模块)并获取此类令牌,​​以便您仅访问客户端真正需要的后端部分。

此令牌必须在客户端缓存并包含在每个请求的标头中。

在 AngularJS 中,如果您使用您创建的模块的配置功能,则可以在中心位置将令牌存储在每个请求的标头中。

    app.config(function($httpProvider) { $httpProvider.defaults.xsrfCookieName = "TOKEN" }

AngularJS 还提供了一些额外的安全特性。例如,您可以使用JSON vulnerability protection mechanism。如果您使用它,您的后端必须将字符 )]}',(您也可以覆盖默认字符)添加到每个 JSON 响应正文。 对于其他客户端,JSON 响应将是无效的 Javascript 代码,但在您的 AngularJS 应用程序中,这些字符将被自动删除。

更新

为您的应用程序实现安全性的最佳方法是阅读和理解OAuth2 规范。

this video 从 11:36 到 17:26 分钟,描述了 JavaScript 流程。

This 站点为不同的编程语言提供了一些标准的实现。

此标准中的一些方面是所有客户端和重定向 url 都必须在附加的身份验证服务器中注册。客户端由唯一的客户端 ID 标识。

为避免其他应用程序拦截您提取令牌的请求,原始令牌应仅在一小段时间内处于活动状态,并且每个 api 请求都必须经过 SSL 加密。

为了提供Single sign-on,也可以使用刷新令牌。

【讨论】:

  • 感谢您的信息。我认为,即使采用您建议的方法,也会存在问题。 1. 如果此方法用于网站,则使用令牌并将其添加到为进行身份验证的每个请求中是有意义的。 2. 但是对于应用程序,如果使用这种方法,我们如何确保令牌本身不会被 fiddler 工具拦截/访问,并且相同的令牌用于调用服务器上的 API?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 2016-05-23
  • 2012-07-30
相关资源
最近更新 更多