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

lit*_*m84 67 javascript rest restful-authentication node.js backbone.js

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

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

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

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

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

ghi*_*man 39

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

基本HTTP身份验证

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

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

auth_basic "Restricted";
auth_basic_user_file /path/to/htpasswd;
Run Code Online (Sandbox Code Playgroud)

(把它放在你的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.


mjt*_*lyn 28

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

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

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

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

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

  • @Dieter它是无状态的,因为状态没有在http中传递 (2认同)
  • @dieter可以构造令牌,以便服务器不必维护已发布令牌的数据库以验证令牌.使用私钥对令牌进行签名,以便具有匹配公钥的任何人都可以验证a)令牌是否由可信服务器发出(真实性)和b)令牌未被修改(保真度).令牌是状态数据,因此服务器可以是无状态的.OAuth2没有定义令牌的内容,只是如何获得令牌.JSON Web令牌(JWT)定义了可与OAuth2一起使用的安全令牌格式. (2认同)

and*_*ser 8

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

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