繁体   English   中英

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

[英]Securing my Node.js app's REST API?

我可以在REST API上提供一些帮助。 我正在编写一个Node.js应用程序,它使用Express,MongoDB并在客户端有Backbone.js。 我花了最近两天的时间试图弄清楚这一切并没有太多运气。 我已经检查过了:

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

但是,我希望这是安全的。 用户已登录我的网络应用程序,我想确保我的API安全。 我读过关于OAuth,OAuth 2.0,OpenID,Hmac,哈希等...我想避免使用外部登录(Facebook / Twitter / etc)我希望注册和登录在我的应用程序/服务器上。

......但我仍然在这里感到困惑。 也许是深夜或我的大脑只是油炸,但我真的可以做一些关于这里做什么的步骤。 我创建安全API的步骤是什么?

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

为了提高安全性/复杂性:

基本HTTP身份验证

许多API库可以让你构建它(例如Django中的Piston),或者你可以让你的web服务器来处理它。 Nginx和Apache都可以使用服务器指令来使用简单的b64encoded密码来保护站点。 它不是世界上最安全的东西,但它至少是用户名和密码!

如果你正在使用Nginx,你可以在主机配置中添加一个部分,如下所示:

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密钥

这些可以是您喜欢的任何格式,但如果您需要,它们可以为您提供撤消访问权限的好处。 如果您正在开发连接的两端,可能不是完美的解决方案。 当你有第三方使用API​​时,它们往往会被使用,例如Github。

OAuth的

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

鉴于您正在进行开发两端,可能就足以将您的API置于Basic HTTP Auth之后并通过HTTPS提供服务,尤其是如果您不想浪费时间来处理OAuth。

这是一种不同的思考方式:

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

现在,我觉得你在这里改变的唯一方法就是提供信息的方式。 您不是将信息作为呈现的HTML提供,而是将信息作为JSON返回并在客户端呈现。 您对服务器的AJAX请求将携带与之前相同的登录令牌,因此我建议只检查该令牌,并以相同的方式将信息限制为“只是允许用户知道的内容”。

您的API现在和您的登录一样安全 - 如果有人知道访问api所需的令牌,他们也会登录到站点并且无论如何都可以访问所有信息。 最好的一点是,如果你已经实现了登录,你就不必再做更多的工作了。

诸如OAuth之类的系统的关键是提供这种“登录”方法,通常来自第三方应用程序和开发人员。 对于iPhone应用程序或类似应用程序而言,这可能是一个很好的解决方案,但这是未来的。 API接受多种身份验证方法没有错!

到目前为止,答案很好地解释了,但是没有给出任何实际步骤。 我看到了这篇博文,详细介绍了如何使用Node + Passport安全地创建和管理令牌。

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

有效保护任何Web应用程序的提示

如果您想保护您的应用程序, 那么您一定要先使用HTTPS而不是HTTP ,这样可以确保在您和用户之间建立安全通道,防止嗅探发送给用户的数据并帮助保存数据交换机密。

您可以使用JWT(JSON Web令牌)来保护RESTful API ,与服务器端会话相比,这有许多好处,其好处主要在于:

1-更具可扩展性,因为您的API服务器不必为每个用户维护会话(当您有多个会话时,这可能是一个很大的负担)

2- JWT是自包含的并且具有定义用户角色的权利要求,例如他在日期和到期日期间可以访问和发布的内容(之后JWT将无效)

3-更容易处理负载均衡器并且如果您有多个API服务器,因为您不必共享会话数据也不需要配置服务器将会话路由到同一服务器,只要有JWT的请求命中任何服务器,就可以对其进行身份验证并授权

4-减少数据库压力,您不必经常存储和检索每个请求的会话ID和数据

5-如果您使用强密钥对JWT进行签名,则JWT不会被篡改,因此您可以信任JWT中随请求一起发送的声明,而无需检查用户会话以及他是否已获得授权,你可以查看JWT,然后你就可以知道这个用户可以做什么和做什么了。

Node.js用于实现JWT的特定库:

许多库提供了创建和验证JWT的简单方法,例如:在node.js中最流行的是jsonwebtoken ,也用于验证JWT,您可以使用相同的库或使用express-jwtkoa-jwt (如果您是使用快递/ koa)

由于REST API通常旨在使服务器保持无状态,因此JWT与该概念更兼容,因为每个请求都是使用自包含的授权令牌(JWT)发送的,而服务器不必跟踪用户会话,而不是使用服务器状态,以便它记住用户和他的角色,但是,会话也被广泛使用并拥有他们的专业人员,您可以根据需要搜索。

需要注意的一件重要事情是,您必须使用HTTPS将JWT安全地传送到客户端并将其保存在安全的地方(例如在本地存储中)。

您可以从此链接了解有关JWT的更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM