Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 保护我的Node.js应用程序';什么是RESTAPI?_Javascript_Rest_Node.js_Backbone.js_Restful Authentication - Fatal编程技术网

Javascript 保护我的Node.js应用程序';什么是RESTAPI?

Javascript 保护我的Node.js应用程序';什么是RESTAPI?,javascript,rest,node.js,backbone.js,restful-authentication,Javascript,Rest,Node.js,Backbone.js,Restful Authentication,我可以在RESTAPI上获得一些帮助。我正在编写一个Node.js应用程序,它使用Express、MongoDB,客户端有Backbone.js。在过去的两天里,我一直在努力解决这一切,但运气不太好。我已经退房了: 我希望后端和前端尽可能分开,所以我认为使用精心设计的RESTAPI会很好。我的想法是,如果我有时间开发iPhone应用程序(或其他类似的应用程序),它可以使用API访问数据 但是,我希望这是安全的。用户已登录到我的web应用程序,我希望确保我的API安全。我读过关于OAu

我可以在RESTAPI上获得一些帮助。我正在编写一个Node.js应用程序,它使用Express、MongoDB,客户端有Backbone.js。在过去的两天里,我一直在努力解决这一切,但运气不太好。我已经退房了:

我希望后端和前端尽可能分开,所以我认为使用精心设计的RESTAPI会很好。我的想法是,如果我有时间开发iPhone应用程序(或其他类似的应用程序),它可以使用API访问数据

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

…但我还是很困惑。也许现在已经很晚了,或者我的大脑已经崩溃了,但我真的可以在这里做些什么。创建安全API的步骤是什么


任何帮助、任何信息、任何示例、步骤或任何东西都会很好。请帮忙

按照增加安全性/复杂性的顺序:

基本HTTP验证 许多API库将允许您在中构建它(例如Django中的活塞),或者您可以让您的Web服务器处理它。Nginx和Apache都可以使用服务器指令来使用简单的b64编码密码保护站点。这不是世界上最安全的东西,但它至少是一个用户名和密码

如果您使用的是Nginx,您可以向主机配置中添加一个部分,如下所示:

auth_basic "Restricted";
auth_basic_user_file /path/to/htpasswd;
(将其放在
位置/
块中)

文件:

您需要获取python脚本来生成该密码,并将输出放入一个文件中:

只要Nginx能够访问文件,文件的位置就无关紧要

HTTPS

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

您可以使用Nginx实现这一点,它的文档非常全面:

一个自我签名的证书就可以了(而且是免费的!)

API密钥 这些可以是您喜欢的任何格式,但它们可以在您需要时取消访问。如果你正在开发连接的两端,可能不是完美的解决方案。当有第三方使用API(如Github)时,往往会使用它们

非统组织 OAuth2.0是与之配套的。虽然我不知道规范的基本工作原理,但它是目前大多数身份验证(Twitter、Facebook、Google等)的实际标准,有大量的库和文档可以帮助您实现这些功能。也就是说,它通常通过请求第三方服务进行身份验证来对用户进行身份验证


考虑到您的开发工作是双向的,将API置于基本HTTP身份验证之后并通过HTTPS提供就足够了,特别是如果您不想浪费时间在OAuth上的话。

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

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

现在,在我看来,你唯一要改变的是信息传递的方式。您不是以呈现HTML的形式交付信息,而是以JSON的形式返回信息并在客户端呈现它。您对服务器的AJAX请求将携带与之前相同的登录令牌,因此我建议只检查该令牌,并以相同的方式将信息限制为“仅允许用户知道的”

您的API现在和您的登录一样安全-如果任何人知道访问API所需的令牌,他们也将登录到该站点并访问所有信息。最好的一点是,若你们已经实现了登录,你们就不需要再做任何工作了


OAuth等系统的要点是提供这种“登录”方法,通常是从第三方应用程序和作为开发人员。对于iPhone应用程序或类似应用程序来说,这可能是一个很好的解决方案,但这是未来的事情。API接受多个身份验证方法没有问题

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


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

如果您想保护您的应用程序,那么您肯定应该首先使用HTTPS而不是HTTP,这样可以确保在您和用户之间创建一个安全通道,防止嗅探来回发送给用户的数据,并有助于对交换的数据保密

您可以使用JWTs(JSON Web令牌)来保护RESTful API的安全,与服务器端会话相比,这有很多好处,主要有:

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

2-JWT是独立的,并具有定义用户角色的声明,例如,在日期和到期日他可以访问和发布的内容(在此之后JWT将无效)

3-更易于跨负载平衡器处理&如果您有多个API服务器,则不必共享会话数据,也不必配置服务器将会话路由到同一服务器,只要JWT的请求击中任何服务器,就可以对其进行身份验证