安全 REST API,无需用户身份验证(无凭据)

2023-11-26

我已经为如何在没有用户身份验证的情况下保护 REST API 的安全而苦苦挣扎了 2 天。

这是什么意思 ?

在我的 AngularJS 应用程序中,我通过向我必须使用的现有服务(companydomain/userinfo)发送 GET 请求来识别用户。我不确定这是如何工作的,因为我不是这段代码的作者,但重点是我在响应中以 JSON 形式获取有关用户的信息(活动目录名称、公司电话...)。

这就是我识别用户所需的全部内容。

我做了什么

现在,我发现很多资源都在谈论 OAuth、唯一令牌等,但似乎没有任何内容与我的问题相符。我实现了一个令牌系统,但它毫无用处,因为我无法确定请求者的真实性。

  1. 用户打开应用程序。应用程序向服务询问与用户相关的信息。公司域/用户信息
  2. 应用程序根据返回的信息向服务器(nodejs 和express)请求令牌。/api/token/get/{user_info}
  3. 服务器生成一个唯一的令牌并将其与到期日期和所有者一起存储在内存中。服务器还会检查“授权用户”表中的用户是否存在(基于活动目录名称),如果不存在则向其中添加新条目。
  4. 应用程序将令牌与每个请求一起发送到 API。/api/entry/delete/{entry_id}

我想您已经明白这里出了什么问题,攻击者可以轻松地向 API 发出损坏的请求来获取合法令牌。所以我的问题是:

由于用户不使用凭据进行身份验证,我如何设法保护我的 API 的安全?

我希望我的问题足够清楚,目前我什至不确定是否可以在不添加凭据系统的情况下解决这个问题。


您可能想看看Passport。它是一个允许您轻松向应用程序添加身份验证的平台。有许多可用的身份验证策略。我在 Node.js 应用程序中使用 Passport 来实现我自己的 hmac 策略。

为了进行身份验证,客户端请求包含一个 API ID 来识别调用者是谁,还包含消息指定部分的签名,其中包括 HTTP 方法、API ID、日期值和一些其他标头值,例如也许是内容类型。要签名的字符串中包含哪些数据由您在实现中决定,但客户端和服务器必须创建并签署相同的字符串才能使身份验证起作用。签名是通过使用共享密钥对字符串进行 hmac 哈希来创建的。

在服务器端,您使用 API ID 检索共享密钥(可能从数据库或文件系统)并对请求执行相同的哈希。如果 hmac 值匹配,则您已验证该请求。为了防止回放攻击,日期包含在请求的签名部分中,并且必须在服务器当前时间的某个窗口内。例如,如果时间戳超过 30 秒,您可能会拒绝该请求。

要启用 API 的新用户,您需要生成新的 API ID 和共享密钥。您将这两者都提供给 API 用户,并将它们存储起来以便在数据库或文件系统中查找。用户必须使用共享密钥对请求进行签名,并将 ID 包含在请求中。

The 鹰策略提供了大部分此类功能,但我们决定推出自己的 hmac 策略。

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

安全 REST API,无需用户身份验证(无凭据) 的相关文章

  • 将 CCtray 与 Jenkins 结合使用,同时启用安全性(使用 HTTPS)

    我将 Jenkins 服务器配置为仅使用 HTTPS 并启用安全性 我也不喜欢任何未登录的人查看仪表板 即使它是空的 在这里 我禁用了 匿名 的 读取 访问权限 到目前为止 所有这些都完全符合我的喜好 但想要通过例如向远程客户端添加一些构建
  • node-mongodb-native的插入性能

    我正在使用 MongoDB 测试 Node js 的性能 我知道其中每一个都很好 彼此独立 但我正在尝试一些测试来感受它们 我遇到了这个问题 但无法确定来源 问题 我正在尝试在单个 Node js 程序中插入 1 000 000 条记录 它
  • 使用 Ionic/angularjs 打开图片库

    如何使用 Ionic angularjs 访问图片库 我只想在每次单击按钮时打开图片库 这怎么可能 您可以使用cordova相机插件 cordova 插件添加 org apache cordova camera 插件参考 https git
  • Material Design Lite 与 AngularJS 的集成 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我知道角材料 https github com angular material这有助于实现在 Angular 单页应用程序中使用的 Mater
  • 寻找Android源代码

    Android API 是开源的吗 如果是这样 我想看看他们如何实现 ListView 对象的 smoothscroll 方法 这是在 API 级别 8 中实现的 但我想针对早期的 API 级别进行构建 我该如何找到这个 是的 它是开源的
  • 错误 11 秒后等待 Protractor 与页面同步超时

    我的量角器测试有问题 我的角度应用程序使用 timeout 不断从服务器轮询某些内容 不幸的是 当我运行测试时 这会导致以下错误消息 There was a webdriver error Error Timed out waiting f
  • 属性中的角度表达式

    我有一个使用 Angular 的页面 其中我从引导程序实现了弹出窗口 img class state msg 数据内容无法正确呈现 它按字面意思返回 item status message 而不是 message 的值 角度在 数据 属性中
  • 客户端登录 - 如何在客户端安全地存储凭据?

    许多 API 都提供通过用户 密码组合远程访问其数据的功能 我想知道存储这些值的最佳方式是什么 高度安全的方式 即使 100 是不可能的 以便直接连接它们而无需每次都询问这些值 我推荐以下三种方法之一 使用身份验证令牌完全避免存储密码 在此
  • 如何在yarn中指定本地注册表?

    我有一个本地 Nexus 服务器 基本上我希望在上线之前先查看一下它prefer offline yarn install prefer offline cache folder C folder yarn cache preferred
  • REST - 复杂的应用程序

    我正在努力将 RESTful 原则应用到我正在开发的新 Web 应用程序中 特别是 为了实现 RESTful 每个 HTTP 请求本身都应该携带足够的信息 以便其接收者对其进行处理 从而与 HTTP 的无状态性质完全一致 该应用程序允许用户
  • 获取telegram群组的所有用户

    我正在尝试获取电报组的所有用户 我看到方法 getChatAdministrators 但我认为 API 没有获取所有成员的方法 我正在使用nodejs的telegram bot api Telegram 机器人 API https cor
  • 通过 PHP 连接到 socket.io(nodejs)

    我需要通过 php 连接到 websocket 发送数据并立即断开连接 无需等待套接字的响应 我用了大象io http elephant io 但更新库后不起作用 请告诉我如何通过 PHP 连接到 websocket 我也遇到了这个问题 学
  • 如何让 Angular-Flask 应用加载 html 部分?

    我试图让我的 Angular Flask 应用程序在基本 html 文件中渲染部分 HTML 文件 应用程序加载基本 html 窗口标题和页脚加载 但 ng view 没有加载任何内容 也许我到局部的角度路由不正确 文件结构 gt flas
  • AngularJS - 服务、工厂、过滤器等中的依赖注入

    因此 我想在我的 Angular 应用程序中使用一些插件和库 目前 我只是引用这些函数 方法 因为它们是在 99 的应用程序中以完全忽略依赖注入的方式使用的 我有 例如 javascript 库 MomentJS 它处理格式化和验证日期 并
  • 使用 Javascript eval() 100% 安全吗?

    我正在编写一个生成 Javascript 代码的 PHP 库 Javascript 代码有许多名为component001 component002 etc 页面通过 AJAX 动态加载 我需要通过 URL 变量传递组件的名称 然后由脚本进
  • 全局未在 ../node_modules/socket.io-parser/is-buffer.js 中定义

    预先感谢您帮助我 我正在尝试在我的一个角度组件中连接套接字 但在浏览器的控制台中它会抛出一个错误 指出 Global 未在 Object node modules socket io parser is buffer js 中定义 这是我的
  • 如何在 ng-repeat 中使用 $index 来启用类并显示 DIV?

    我有一套 li 元素 ul li a href href ABC a li li a href href DEF a li li a href href A index a li ul li
  • 彭博开放 API

    彭博开放 API最近宣布 http www computerworlduk com news it business 3334375 bloomberg market data api made public 这只是彭博软件开发工具包 ht
  • Rails 3 + angularjs + 缩小在生产中不起作用:未知提供者:eProvider

    我已遵循我能找到的所有修复缩小的说明 例如 var MyController function renamed scope renamedGreeter MyController inject scope greeter and someM
  • Spring RESTful控制器方法改进建议

    我是 Spring REST 和 Hibernate 的新手 也就是说 我尝试组合一个企业级控制器方法 我计划将其用作未来开发的模式 您认为可以通过哪些方法来改进 我确信有很多 RequestMapping value user metho

随机推荐

  • Console.Write 在 Windows 窗体应用程序中不起作用

    我在 Visual Studio 2008 中创建了一个 VB NET Windows 窗体应用程序 当我从命令行运行程序时 我没有得到任何输出 只有下一个提示 我究竟做错了什么 Private Sub Form1 Load ByVal s
  • Asp.Net 身份和多租户上的重复角色名称

    我正在使用 ASP Net MVC 和 Identity 2 0 开发多租户 Web 应用程序 我已经像这样扩展了 IdentityRole public class ApplicationRole IdentityRole public
  • 在本机反应中单击按钮时显示加载程序

    我正在尝试在我的反应本机应用程序中实现加载器动画 但单击按钮时它不会触发加载器 尽管动画已经更改为true 看看我下面的代码 componentWillMount this hideLoader showLoader gt this set
  • where-object $_ 匹配多个条件

    data where object Name eq serverName domain com select object Property Description1 Version where object Description1 ma
  • 概念可以与模板模板参数一起使用吗?

    让我们考虑以下代码 include
  • 找不到参数的方法 jackOptions()

    大家好 我面临着 在 DefaultConfig Decolated name main Dimension null minSdkVersion DefaultApiVersion mApiLevel 16 mCodename null
  • 将动态键:值对传递给对象文字? [复制]

    这个问题在这里已经有答案了 我正在使用这段代码 如下所示 来尝试填充名为的对象文字Parameters在 for 循环内 我需要key value与循环迭代一起分配的对i变量 例如 key 1 chunks 1 key 2 chunks 2
  • 动态添加属性到动态对象?

    我有这个 dynamic d new ExpandoObject d Name attribute QualifiedName Name 所以 我知道 d 将有一个属性名称 现在 如果我在编译时不知道属性的名称 如何将该属性添加到动态中 我
  • 如何通过 Telegram Bot 发送文件

    我需要使用 TelegramBot API 发送 txt 文件 我已经尝试过了 并有问题 ok false error code 400 description 错误请求 错误的远程 指定的文件 ID 字符串长度错误 为了完成唐尼的回答 我
  • 查询中的问号运算符

    在我的 laravel 5 应用程序中 我使用 PostgreSQL 的 jsonb 数据类型 它有 操作员 但我无法让它在我的模型中工作 因为 laravel 使用问号作为绑定 具体来说 在 whereRaw 方法中 query gt w
  • Idea 中不显示字体

    更新 jrk7 openjdk 和 jre7 openjdk 字体后 Idea 中不显示字体 重新安装软件包 openjdk 和 idea 没有帮助 名称 a Linux ftp27host 3 14 6 1 ARCH 1 SMP PREE
  • 使用 pip 安装 uwsgi 时出现“ascii”编解码器无法解码错误

    我正在按照本教程设置 uwsgi https uwsgi readthedocs org en latest tutorials Django and nginx html I run pip install uwsgi在virtualen
  • Visual Studio - 用资源替换硬编码字符串的工具

    我有一个大型 ASP NET 项目 其中充满了硬编码字符串 现在必须将其提取到资源中 此类字符串几乎可以在任何地方找到 cs 文件 aspx 文件 ascx 文件等 并且文件数量巨大 我正在寻找一种工具 或任何方式 来一次找到所有这些硬编码
  • 从内存流读取存储的 PDF

    我正在使用 C 和 SQLServer 2012 开发一个数据库项目 在我的一个表单中 我有一个 PDF 文件 其中包含存储在表中的一些其他信息 这是成功的 但是当我想检索存储的信息时 我在显示 PDF 文件时遇到问题 因为我无法显示它 而
  • 具有多个数据库/DbContext 的 EF Code First 迁移

    我有两个数据库 每个数据库都有自己的 dbcontext 我设置了两个迁移配置 我可以为第一个数据库添加迁移 这很好 Add Migration DB1 InitialCreate ConfigurationTypeName DB1Conf
  • 使用 Jenkins Job-DSL 配置块将自定义步骤放置在特定位置

    我正在尝试使用 job dsl plugin 编写之前手动配置的大量 Jenkins 作业的配置脚本 这些作业的一种风格有多个步骤 其中包括使用 XShell 插件的几个步骤 job dsl 不直接支持这一点 不过 我应该能够通过使用自定义
  • 编写一个识别声音并执行操作的程序

    我想编写一个能够存储声音模式的程序 例如火车汽笛 喇叭 嘟嘟声 通过麦克风收听声音 然后在听到声音时采取一些行动 我懂一点Python 很早以前就用VB 编程过 我主要是一个 Oracle PLSQL 人员 该程序需要一个适度的用户界面 解
  • 消息通道是一个还是多个?

    我需要处理来自大约 30 个地址的电子邮件 我以一种将所有电子邮件发送到一个的方式来实现这一点DirectChannel之后到Receiver In Receiver我可以了解消息来自哪个地址 为此我创建了CustomMessageSour
  • jasperreport 5.0.1需要添加哪些依赖?

    I 升级jasper报告版本 from 4 5 0 至 5 1 0 当我安装插件时 它会抛出错误 例如缺少某些依赖项 我想使用 Maven 配置 JasperReports 5 1 0 Execution default of goal o
  • 安全 REST API,无需用户身份验证(无凭据)

    我已经为如何在没有用户身份验证的情况下保护 REST API 的安全而苦苦挣扎了 2 天 这是什么意思 在我的 AngularJS 应用程序中 我通过向我必须使用的现有服务 companydomain userinfo 发送 GET 请求来