首页 文章

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

提问于
浏览
67

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

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

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

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

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

4 回答

  • 0

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

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

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

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

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

  • 39

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

    基本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 .

  • 8

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

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

  • 28

    Tips valid for securing any web application

    如果您想保护您的应用程序, then you should definitely start by using HTTPS instead of HTTP ,这可确保您与用户之间 Build 安全通道这将防止嗅探发送给用户的数据,并有助于保持数据交换机密 .

    You can use JWTs (JSON Web Tokens) to secure RESTful APIs ,与服务器端会话相比,这有许多好处,其好处主要是:

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

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

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

    4-减少对数据库的压力,并且您不必为每个请求不断存储和检索会话ID和数据

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

    Node.js specific libraries to implement JWTs:

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

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

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

    您可以了解有关JWT的更多信息from this link

相关问题