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

2024-04-16

我可以在 REST API 上获得一些帮助。我正在编写一个 Node.js 应用程序,它使用 Express、MongoDB 并在客户端使用 Backbone.js。在过去的两天里,我一直在努力解决所有这些问题,但运气不佳。我已经查过了:

  • 保护 REST API 的安全 https://stackoverflow.com/questions/2676241/securing-a-rest-api
  • 使用 OAuth 保护我的 REST API,同时仍然允许通过第三方 OAuth 提供商进行身份验证(使用 DotNetOpenAuth) https://stackoverflow.com/questions/4574868/securing-my-rest-api-with-oauth-while-still-allowing-authentication-via-third-pa
  • http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/ 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/ http://tesoriere.com/2011/10/10/node.js-getting-oauth-up-and-working-using-express.js-and-railway.js/

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

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

...但我仍然很困惑。也许现在已经是深夜了,或者我的大脑已经崩溃了,但我确实可以采取一些步骤来解决这里的问题。创建安全 API 的步骤是什么?

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


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

基本 HTTP 身份验证

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

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

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

(将其放入您的location / block)

Docs: http://wiki.nginx.org/HttpAuthBasicModule http://wiki.nginx.org/HttpAuthBasicModule

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

文件的位置并不重要,只要 Nginx 可以访问它即可。

HTTPS

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

你可以使用 Nginx 来做到这一点,它的文档非常全面:http://wiki.nginx.org/HttpSslModule http://wiki.nginx.org/HttpSslModule

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

API Keys

这些可以是您喜欢的任何格式,但它们可以让您在需要时撤销访问权限。如果您正在开发连接的两端,这可能不是您的完美解决方案。当您有第三方使用 API(例如 Github)时,通常会使用它们。

OAuth

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

鉴于您在两端进行开发,将您的 API 置于基本 HTTP Auth 后面并通过 HTTPS 提供服务可能就足够了,特别是如果您不想浪费时间搞 OAuth。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

保护我的 Node.js 应用程序的 REST API 安全? 的相关文章

  • 从 x,y 屏幕空间坐标查找 2D 等距网格上的列、行(将方程转换为函数)

    我试图在屏幕空间点 x y 的二维等距网格中找到行 列 现在我几乎知道我需要做什么 即找到上图中红色向量的长度 然后将其与表示网格边界的向量的长度 由黑色向量表示 进行比较 现在我在数学堆栈交换中寻求帮助 以获得用于计算点 x y 与黑色边
  • 使用 Javascript 在 Imacros 中循环

    我如何使用 javascript 循环 imm imacros 脚本 我搜索了一下 发现了这个 for i 0 i lt n i iimPlay marconame iim 但当我使用它时 我的浏览器 Firefox 18 挂起 for i
  • 为什么 jQuery 点击事件会多次触发

    我这里有这个示例代码http jsfiddle net DBBUL 10 http jsfiddle net DBBUL 10 document ready function creategene click function confir
  • 计算Javascript中两次点击之间的时间

    我想用 javascript 计算属性的两次点击之间的时间 但我不知道如何 例如 a href click here a 如果用户单击多次 假设 5 秒内 我想显示警报 如果有帮助的话我正在使用 jQuery 我对 javascript 不
  • 将音频与视频流合并 Node.js

    我正在创建 YouTube 视频下载器并且正在使用ytdl core库 它无法下载带有音频的高质量视频 因为 youtube 将其放在另一个文件中 但我需要将其全部下载到一个文件中 我已经这样做了 app get download asyn
  • 禁用 JavaScript 中的右键单击

    当我尝试禁用右键单击时 它不起作用 我尝试使用下面的代码 document onclick function e console log e button if e button 2 e preventDefault return fals
  • 由于缺少会话而在 Next.js 中使用 Next-Auth 进行重定向时,如何显示 Toast 通知? [复制]

    这个问题在这里已经有答案了 例如 假设我有一个名为internal tsx 的页面 其中包含 export const getServerSideProps GetServerSideProps async ctx gt const ses
  • JavaScript 动画平滑滚动

    默认情况下 当您有这样的片段链接时 a href some url some fragment some text a 浏览器立即向下滚动到该片段 我该如何编程才能使用标准 JS 顺利地向下移动到该片段 这是一个例子 Example htt
  • 使react-leaflet能够离线使用

    我一直在使用反应传单 https github com PaulLeCam react leaflet图书馆 到目前为止运作良好 现在我希望网站预加载尽可能多的图块 以便网络应用程序 也是 PWA 可以在没有互联网的情况下使用 我找到了一些
  • AJAX:检查字符串是否为 JSON?

    我的 JavaScript 有时会在这一行崩溃 var json eval this responseText 当争论时会导致崩溃eval 不是 JSON 在进行此调用之前有什么方法可以检查字符串是否为 JSON 我不想使用框架 有什么方法
  • 访问 TypeScript 数组的最后一个元素

    TypeScript 中有访问数组最后一个元素的符号吗 在 Ruby 中我可以说 array 1 有类似的东西吗 您可以通过索引访问数组元素 数组中最后一个元素的索引将是数组的长度 1 因为索引是从零开始的 这应该有效 var items
  • 如何清除WebGL中的矩形区域?

    WebGL 有一个clear清除整个表面的方法 清除表面的特定矩形的最佳方法是什么 例如 我想将一个从 50 50 开始的 100x100 像素框设置为全零 ARGB 0 0 0 0 我现在能想到的就是用一个写入零的片段着色器绘制一个四边形
  • 如何访问另一个 mobx 商店中的 mobx 商店?

    假设以下结构 stores RouterStore js UserStore js index js each of Store jsfiles 是一个 mobx 存储类 包含 observable and action index js只
  • Node.js 可读流_read用法

    我了解如何在 Node 的 new 中使用可写流Streams2库 但我不明白如何使用可读流 举个例子 一个流包装器围绕dgram module var dgram require dgram var thumbs twiddle func
  • 加载另一个 JS 脚本后加载

    这是我的代码 very big js file lots of html stuff 问题是 这些是异步加载的 有没有办法等待第二个脚本直到第一个脚本加载 如果您使用 jQuery 有一个非常简单的方法可以通过获取脚本 https api
  • 需要js、d3 和 nvd3 集成

    我面临整合的问题要求 questions tagged requirejs with d3 questions tagged d3 and nvd3 questions tagged nvd3 我找到了一个使用 require 的简单解决方
  • 您如何看待引导模式触发器的相应回调?

    On 引导模态 http getbootstrap com javascript modals 我们知道我们可以为触发器绑定事件 例如show or hide using show shown hide hidden 但此事件绑定仅适用于一
  • 当选择下拉列表中的某些值时,取消选中复选框

    当我从下拉列表中选择某个值或用户未从下拉列表中选择任何值时 我需要取消选中复选框 我现在正在使用 Jquery 这是我现在使用的代码 但它不起作用 Script
  • Django 与谷歌图表

    我试图让谷歌图表显示在我的页面上 但我不知道如何将值从 django 视图传递到 javascript 以便我可以绘制图表 姜戈代码 array Year Sales Expenses 2004 1000 400 2005 1170 460
  • Restangular - _.contains() 不是一个函数

    如果您最近通过 Bower 更新了 Restangular 它将安装最新的 Lodash 新的 4 0 然而 这是一个问题 因为 Restangular Angular 现在会抛出错误 contains 不是函数 你怎么解决 解决方案非常简

随机推荐