保护我的Node.js应用程序的REST API?

我可以在我的REST API上做一些帮助。 我正在写一个Node.js应用程序,它使用Express,MongoDB,并在客户端有Backbone.js。 我花了最后两天的时间,试图解决所有这些问题,没有太多的运气。 我已经检查过

  • 保护REST API
  • 使用OAuth保护我的REST API,同时仍允许通过第三方OAuth提供者进行身份validation(使用DotNetOpenAuth)
  • http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/
  • http://tesoriere.com/2011/10/10/node.js-getting-oauth-up-and-working-using-express.js-and-railway.js/

我想保持我的后端和前端尽可能分开,所以我想使用精心devise的REST API会很好。 我的想法是,如果我总是开发一个iPhone应用程序(或类似的东西),它可以使用API​​来访问数据。

但是,我希望这是安全的。 用户已经login到我的networking应用程序,我想确保我的API是安全的。 我读了关于OAuth,OAuth 2.0,OpenID,Hmac,哈希等…我想避免使用外部login(Facebook / Twitter /等)我想注册和login在我的应用程序/服务器。

…但我仍然在这里困惑。 也许是在深夜,或者我的大脑只是被炸,但我真的可以采取一些措施,在这里做什么。 我有什么步骤来创build一个安全的API?

任何帮助,任何信息,任何示例,步骤或任何东西都会很棒。 请帮忙!

这里有一个不同的思考方式:

让我们假设你没有使用API​​。 您的用户login到应用程序,提供一些凭据,并且向用户提供某种types的cookie或类似的令牌,用于识别用户已经login。然后,用户请求包含受限信息的页面(或创build/修改/删除它),所以你检查这个令牌,以确保用户被允许查看该信息。

现在,听起来你在这里唯一改变的是信息传递的方式。 不是将信息作为呈现的HTML来传递,而是以JSONforms返回信息并将其呈现在客户端。 您对服务器的AJAX请求将会携带与之前相同的login令牌,因此我build议只检查该令牌,并以相同的方式将信息限制为“允许用户允许知道的内容”。

您的API现在与您的login一样安全 – 如果有人知道访问api所需的令牌,他们也将login到该站点,并且无论如何都可以访问所有信息。 最好的一点是,如果你已经实现了login,你并不需要做更多的工作。

OAuth等系统的重点在于提供这种“login”方法,通常来自第三方应用程序和开发人员。 这可能是一个iPhone应用程序或类似的一个很好的解决scheme,但这是在未来。 接受多个validation方法的API没有错!

为了增加安全性/复杂性:

基本的HTTPvalidation

许多API库可以让你build立这个(例如在Django的活塞),或者你可以让你的networking服务器处理它。 Nginx和Apache都可以使用服务器指令来保护一个简单的b64编码密码的网站。 这不是世界上最安全的东西,但它至less是一个用户名和密码!

如果您使用的是Nginx,您可以像这样在主机configuration中添加一个部分:

auth_basic "Restricted"; auth_basic_user_file /path/to/htpasswd; 

(把它放在你的location /块)

文档: http : //wiki.nginx.org/HttpAuthBasicModule

您需要获取python脚本来生成该密码并将输出放入一个文件中: http : //trac.edgewall.org/browser/trunk/contrib/htpasswd.py?format=txt

只要Nginx具有访问权限,文件的位置并不重要。

HTTPS

确保从服务器到应用程序的连接,这是最基本的,将防止中间人攻击。

你可以用Nginx做这个,这个文档非常全面: http : //wiki.nginx.org/HttpSslModule

这样的自签名证书将是罚款(免费!)。

API密钥

这些可以是你喜欢的任何格式,但是如果你需要的话,它们可以让你取消访​​问的好处。 如果您正在开发连接的两端,可能不是完美的解决scheme。 当你有第三方使用API​​时,他们倾向于使用,例如Github。

OAuth的

OAuth 2.0是在这里去的人。 虽然我不知道规范的基本工作原理,但它现在是大多数身份validation(Twitter,Facebook,Google等)的事实标准,并且有大量的库和文档可以帮助您实现这些规范。 这就是说,它通常用于通过请求第三方服务进行身份validation来对用户进行身份validation。

鉴于您在开发两端,将您的API放在基本HTTP身份validation之后,并通过HTTPS提供服务,特别是如果您不想浪费时间搞乱OAuth,就足够了。

到目前为止的答案做了一个很好的解释,但不给任何实际的步骤。 我遇到了这篇博客文章,详细介绍了如何使用Node + Passport安全地创build和pipe理令牌。

http://aleksandrov.ws/2013/09/12/restful-api-with-nodejs-plus-mongodb/