REACT 应用程序调用安全的 Azure WEBAPI 服务 - 无用户

2023-12-30

我创建了一个简单的 REACT 应用程序,该应用程序仅在连接到我们网络上大屏幕的本地 PC 上运行。仅供内部使用!它就像广告牌或仪表板。零用户交互。屏幕不是触摸屏,也没有连接键盘和鼠标。因此没有用户可以登录。

构建 REACT 应用程序,然后将其部署到 PC 上的文件夹中。全部自动化。初始部署包括所有当前数据。然后在 Windows 启动时执行类似这样的命令: “python -m http.server 3000”(只是例子......)

该应用程序具有随该应用程序一起部署的初始数据,但是,我希望它还能够调用安全的 Azure WebAPI 服务以每隔几分钟获取更新的统计信息。数据非常小。主要是整数值。我只是想提供一些实时更新。

我让 REACT 应用程序完全正常工作(如果 WEBAPI 不安全)或者单个调用允许匿名。但是,我们的业务规则要求所有端点都是安全的。

此应用程序在本地运行,但 API 是 Azure 应用程序服务。

我已在 Azure AD 中将 REACT 应用程序设置为注册应用程序,并将其配置为具有调用 WEBAPI 服务的权限。

我有许多控制台应用程序,它们的设置和工作方式与此 REACT 应用程序基本相同。对于 C# 守护程序应用程序,有一个 MSAL 包可以让这一切变得简单。

我正在尝试学习 REACT,并且不想将其构建为另一个 WPF 或 UWP 应用程序,而是想尝试使用 REACT。

所以,我知道我需要一个访问令牌。我正在考虑使用客户端 ID 和 Secret,就像我在用 C# 编写的 C# 守护程序客户端中所做的那样。

我找不到任何在没有用户登录的情况下执行此操作的 REACT 或 Angular 示例。请记住,PC 没有输入设备。仅显示。同样,我的应用程序没有用户。它调用安全 API 来获取数据。就是这样。

感谢您的帮助。

使用 Joy Wang 的评论和文档中的此页面:服务到服务访问令牌请求 https://learn.microsoft.com/en-us/previous-versions/azure/dn645543(v=azure.100)?redirectedfrom=MSDN

这是我的新代码:

const adalConfig = {
  tenant: '...',
  clientId: '...',
  clientSecret: '...',
  authority: 'https://login.microsoftonline.com/{tenant}/oauth2/token',
  endpoints: {
    apiResourceId: 'api://bbbbbb-...',
  },
};

function getAccessToken() {
  var requestParams = {
    grant_type: 'client_credentials',
    client_id: adalConfig.clientId,
    client_secret: adalConfig.clientSecret,
    resource: adalConfig.endpoints.apiResourceId
  };

  // Make a request to the token issuing endpoint.
  fetch(adalConfig.authority,
    {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify( requestParams )
    }).then(response => {
      if (response.status >= 200 && response.status < 300) {
        console.log(response);
        console.log(response.json());
      } else {
        console.log('Somthing happened wrong');
        console.log(response);
      }
    }).catch(err => err);
}

当我调用上面的函数时,我得到以下响应:

响应{类型:“cors”,网址:“https://login.microsoftonline.com/.../oauth2/token”,重定向:false,状态:400,ok:false,…} 身体: (...) 身体使用:假 标题:标题{} 好的:假的 重定向:假 状态:400 statusText:“错误请求” 类型:“cors” 网址:“https://login.microsoftonline.com/.../oauth2/token”proto: 回复

也许还有另一种方法来启动 REACT 应用程序,以便不检查 CORS?有任何想法吗?

再次感谢。


因此,目前没有一种安全的方法来完成我想要的事情。基本问题是您无法在浏览器中使用来自 JavaScript 的客户端凭据授予类型。

不过,我认为我有一个很好的解决办法可以帮助其他人。我确信它不适合大多数应用。我相信 OAUTH 正在研究解决方案,因此在不久的将来可能不需要这个解决方案。如果添加更好的解决方案,我很乐意将其标记为正确答案。感谢您的帮助。

我的应用程序基本上是一个零用户输入的自动化仪表板/广告牌。它提取安全数据并显示它。 REACT 应用程序仅位于墙上的本地 PC 上,没有任何输入。 PC 打开时会运行脚本。

该脚本使用 http 服务器(例如 python)启动构建的 REACT 应用程序。 例如:“python -m http.server 8000”

然后,该脚本以 kiosk 模式打开浏览器,因此您在屏幕上看到的唯一内容就是应用程序。

到目前为止,这和我之前的情况一模一样。

解决方法:我创建了一个名为 GetToken 的命令行实用程序。在脚本启动 REACT 应用程序之前,它会像这样调用此实用程序:“gettoken --client Dashboard --file token.json” 该实用程序进行客户端凭据授予类型调用以获取令牌。 然后,它将该令牌与其他构建的 REACT 文件一起保存到本地 json 文件中。例如:\public\data\token.json

在我的 REACT 应用程序中,它只是加载令牌并使用它。

const t = await fetch('./data/token.json').then(r => r.json());
this.setState({ token: t.token });

然后我将其添加到我的 api 调用中,如下所示:

const fetchOptions = {
  method: 'GET',
  headers: {
    "Authorization": `Bearer ${this.state.token}`,
    "Content-Type": "application/json"
  }
};
const newSlides = await fetch(this.state.baseUrl + '/api/Dashboard/GetSlides', fetchOptions).then(response => response.json());

重要提示:只有当您也有能力更新 API 时,这才有效。如果不能,那么您仍然会收到 CORS 错误。您必须允许来自用于启动应用程序的本地主机和端口的调用。您应该选择 3000、4200 或 8000 以外的值。

我将以下内容添加到我的 APIstartup.cs 中:

public void ConfigureServices(IServiceCollection services) {
  ...

  var origins = Configuration.GetSection("AppSettings:AllowedOrigins").Value.Split(",");
  services.AddCors(o => o.AddPolicy(specificOriginsPolicy, builder => {
    builder.WithOrigins(origins)
      .AllowAnyMethod()
      .AllowAnyHeader()
      .AllowCredentials()
      .SetIsOriginAllowed((host) => true);
  }));

  ...
}

public void Configure(IApplicationBuilder app) {
  ...
  app.UseCors(specificOriginsPolicy);
  ...
}

我仍在完善这个解决方案,但到目前为止效果很好。我可以将该实用程序转变为后台服务,定期更新令牌。或者我可以将该实用程序转换为 Shell,然后使用它代替脚本。不管怎样,你明白了。

LESSON:我知道我可以将其作为 UWP 或 WPF 应用程序来完成,并避免所有这些问题,但主要目标是学习 REACT。我学到了很多。我会再做一次。令人震惊的是,现在我的 REACT 应用程序已经完成,代码却如此之少。我相信 REACT 可以用于许多类似的场景。

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

REACT 应用程序调用安全的 Azure WEBAPI 服务 - 无用户 的相关文章

  • 自定义rc-time-picker的样式

    我在用rc time picker我的项目的包 但我在自定义样式时遇到问题pop up of my time picker成分 这是我的组件的屏幕截图 首先 我需要更改时间的背景颜色item在当时li from light grey 在屏幕
  • 如何在故事书中注入窗口变量?

    我想添加一个 React 组件 称为ApplicationForm to a 故事书 https github com storybooks storybook 故事书是这样写的 import configureStore from sto
  • 如何在react-bootstrap中禁用表单提交的

    在下面的代码片段中 我有许多文本类型的输入表单 如果用户点击 我似乎会得到相同的合成事件 就像他们按下提交按钮一样 我想忽略作为表单提交 只允许一个人按下 提交 按钮 我删除了一些表单组以减少示例 在所有情况下 按钮或 ENTER 键 e
  • Cypress 在 Create React App 中返回 .scss 文件的 webpack 编译错误

    我正在尝试将 Cypress 添加到非常基本的 CRA 但遇到了 Cypress 无法理解 scss 文件的问题 当我跑步时npm run cypress运行测试 我收到以下错误 Error Webpack Compilation Erro
  • 无法将 Material UI 安装到新的 React 应用程序

    我是开发世界的新手 我正在尝试使用材质 UI 作为组件库启动一个新的 React 应用程序 但我不断收到以下错误 我的文件如下所示 任何人都可以用通俗的语言提供帮助吗 TIA npm install save legacy peer dep
  • 陷入了 React useEffect 的一系列变化

    我正在反应中创建一个表单生成器 在一个简单的文本字段上 我需要 Change currentValue When currentValue已更改 验证它 验证完成后 发出一个事件 有效或无效 这是我的代码 const TextInput p
  • React Typescript - 在路由中传递时如何将类型添加到 location.state

    当我将react router props发送到路由中的组件时 我收到错误 因为我有特定的状态 我传递了该组件 但错误显示在我的路由中 这是路线代码
  • 如何在 React 组件中使用 CDN

    我正在尝试使用基于 D3 构建的库 称为 Greuler 来动态渲染图形 它的 npm 包似乎已损坏 当我改用 Greuler CDN 时 index html 中的测试图终于起作用了 但是 我正在开发一个 React 应用程序 并且我希望
  • SWC with JavaScript:如何处理 CSS 导入以及如何绝对导入?

    TL DR 如何告诉 SWC 编译 React 组件中导入的 CSS 文件 如何告诉 SWC 在测试和 React 组件中编译绝对导入 这是一个最小的可重现示例 https github com janhesters riteway swc
  • 如何从CDN注入外部JS到Jest单元测试?

    我有 npm 和 webpack 的反应应用程序 我正在尝试向其添加单元测试 我使用的是包含在我的index html 中的CDN 的jQuery 而不是使用节点模块 我在组件中使用 jQueryTest1我向其中添加了单元测试用例 现在
  • React:在哪里扩展对象原型

    我使用创建了一个纯 React 应用程序创建反应应用程序 https github com facebookincubator create react app 我想延长String类并在一个或多个组件中使用它 例如 String prot
  • Redux 状态 - 最大推荐大小

    我正在构建一个项目管理应用程序 但我仍然在努力解决一个问题 在 Redux 状态中存储什么以及 按需 加载什么 Redux 状态是否有已知的 最大推荐大小 几十千字节 几百千字节 兆字节单位 请记住 归根结底 Redux 只是 如何 将信息
  • 如何使用 Jest 测试 React 渲染的异步数据?

    我使用 React 进行渲染 使用 Jest Jasmine 进行测试 我用旧的 Jest Jasmine 编写了测试waitsFor and runs但这些现在在 Jasmine 2 中已经消失了 我不知道如何用新的替换done asyn
  • 将 useRef 挂钩传递给 ref 属性的正确方法

    我不确定如何更明确地提出这个问题 但它是关于值传递 and 引用传递反应中的情况 还有胡克斯 我正在使用 gsap 来制作 div 滑入和滑出的动画 这是其上下文 但我猜测 ref 的用途并不重要 因此 这工作得很好 尽管这是一种更典型的类
  • React/Redux bundle.js 太大

    我有一个小型的 React 项目 Webpack生成的bundle js大小为6 3Mb 如何将大小减小到 github webpack config js module exports devtool inline source map
  • React router.push 和 router.replace 之间的区别?

    有什么区别React 路由器推送 and 路由器 替换 路由器历史记录就像一个stack of routes 当您使用router replace 您将覆盖堆栈的顶部 当使用router push 它在顶部添加了一条新路线stack 路由器
  • React Material UI CardMedia 视频组件未播放

    我看到缩略图 但无法启动或停止视频 还有什么方法可以让它自动播放和重复吗 https material ui com api card media https material ui com api card media
  • npm 命令 create-react-app 失败

    我正在尝试在运行 Os X sierra 10 12 6 的计算机 mac pro 2017 上测试reactjs 我已经遵循了 Facebook 教程 确保您安装了最新版本的 Node js done 按照安装说明进行操作创建一个新项目
  • 使用 useReducers 调度函数发送多个操作?

    使用时是否可以通过调度函数发送多个动作useReducer挂钩反应 我尝试向它传递一组操作 但这会引发未处理的运行时异常 明确地说 通常会有一个初始状态对象和一个减速器 如下所示 const initialState message1 nu
  • 如何将背景图像仅应用于一个反应页面而不是整个应用程序?

    注册页面示例 register background image linear gradient to right ff5722 0 ff9800 100 margin top 150px important div div div div

随机推荐

  • .htaccess 重写规则,强制将 https 重定向到 http

    我有一个主域https www domain com or https domain com和通配符 DNS 类似https domain com index php name abcd强制重定向http abcd domain com但我
  • 为什么将队列实现为循环数组?

    当实现像队列这样的 FIFO 时 我的导师总是建议我们将其表示为循环数组而不是常规数组 为什么 是因为在后者中 我们最终会在数组中出现垃圾数据吗 如果您使用固定数量的阵列插槽 元素 则以圆形排列回收插槽会更容易 因为您不需要重新排序元素 每
  • 在 Python 桌面应用程序中安全分发 OAuth 2.0 client_secret

    我正在寻找一些有关如何设计和创建我自己的桌面应用程序 或已安装的应用程序 https developers google com identity protocols OAuth2 installed 在需要 OAuth 2 0 授权流到
  • 任务应用程序:compileDebugJavaWithJavac 失败

    当尝试在 Android 上运行我的 React Native 应用程序时 我收到此错误 失败 构建失败并出现异常 什么地方出了错 任务 react native firebase app compileDebugJavaWithJavac
  • Spring Kafka 错误处理 - v1.1.x

    如何处理错误处理春天卡夫卡 questions tagged spring kafka版本1 1 x 据我所知 它是在版本中引入的2 0 https github com spring projects spring kafka blob
  • Event.observe 'change' 事件在 IE 中没有被触发

    我用于更改选择菜单的原型事件侦听器未在 IE 中触发 Event observe use billing change Checkout getBillingData 这在 Firefox 中工作得很好 当然 但在 IE 中没有任何反应 当
  • 在抓取图像 src 上获取 base64 字符串

    我正在从网站上抓取图像 src 标题 价格等 但它给出了 base64 字符串来代替图像 src 当我将所有这些抓取的数据附加到 uri 时 它显示错误长 uri 如何减缓这个问题 如果您获得一个 base64 字符串作为 img src
  • 模板未在backbone.js中加载(TypeError:文本未定义)

    我在学主干 js http backbonejs org 我还处于起步阶段 我想通过添加模板下划线 http underscorejs org template模板方法 但它对我不起作用 我搜索了这个错误 但无法自行修复 如果没有显示模板
  • 除了请求许可之外,如何在不干扰当前前台进程的情况下获取 MediaProjectionManager?

    问题 我有一个屏幕截图应用程序 它使用浮动覆盖服务进行控件 并使用屏幕投射 API 媒体项目管理器来访问屏幕 有时 当设备内存不足时 Android 会重新启动服务 我就会丢失媒体投影 据我所知 重新获取新媒体投影的唯一方法是重新打开请求权
  • 添加了 ValidationContext 项的 MVC 和 EF 验证

    我有一个场景 我想将一个项目添加到 ValidationContext 并在 EF 触发的实体验证中检查它 我在向导中执行此操作 因此我只能在特定步骤上验证某些内容 如果有好的模式 请分享 问题在于 在控制器操作被击中之前 验证实际上被触发
  • Flutter Bloc 状态更改未使用 get_it 更新 UI

    我一直在结合使用本登录教程和 resocoder clean 架构教程来构建登录 身份验证功能 99 工作正常 但无法正确响应LoginButton被压 由于某种原因 当LoginBloc calls AuthenticationBloc
  • 如何检索 cl.exe 的路径?

    我想检索编译器的完整路径cl exe在 Visual Studio 中从程序中调用它 我们在注册表中是否有相应的密钥 怎么做 cl exe通常位于 VCINSTALLDIR bin VCINSTALLDIR默认情况下未设置环境变量 但在打开
  • 如何通过单击按钮更改文本颜色?

    我有如下文字 p strong em QUESTION WHAT IS YOUR NAME em strong p
  • 如何使用 bind_result 与 get_result 的示例

    我想看一个如何使用调用的示例bind result vs get result以及使用其中一种而不是另一种的目的是什么 还有使用每种方法的优点和缺点 使用这两种方法有什么限制 有什么区别吗 虽然这两种方法都适用 查询 当bind resul
  • 在单个查询中保存多行

    有没有办法让 cake 在单个查询中执行多行插入 而无需编写原始 SQL 来执行此操作 saveMany 和 saveAssociated 选项只会在单个事务中保存多行 但该事务包含多个插入语句 因此这些方法显然不是编写重型应用程序的解决方
  • Dozer 映射类级别是可访问的

    我正在使用推土机框架来克隆我的对象 我希望推土机框架在不使用 getter 和 setter 的情况下克隆数据 为此我在类级别设置 is accessible 属性 但这似乎不起作用 当我在字段级别设置 is accessible 时 它
  • 使用 Windows mklink 链接 2 个文件

    我试图在 Windows 上找到 nix 符号链接的等效项 并开始使用 mklink 问题是 作为普通用户 不是管理员 我可以使用 J 选项链接到文件夹 但无法链接到文件 我设法以管理员身份执行此操作 但我需要以标准用户身份执行此操作 为什
  • 为什么使用 Scala-IDE 的 Scala 工作表会给出此错误?

    在 Scala 工作表中我可以这样做 object Play println Playing a bit gt Playing a bit case class X a Int 1 x List X 但我不能这样做 object Play
  • JWT 实际上如何与 Spring MVC 一起创建令牌并验证令牌?

    我实际上希望获得更多 更清晰的理解JWT概念及其运作方式Spring MVC 我找到了链接https github com nielsutrecht jwt angular spring https github com nielsutre
  • REACT 应用程序调用安全的 Azure WEBAPI 服务 - 无用户

    我创建了一个简单的 REACT 应用程序 该应用程序仅在连接到我们网络上大屏幕的本地 PC 上运行 仅供内部使用 它就像广告牌或仪表板 零用户交互 屏幕不是触摸屏 也没有连接键盘和鼠标 因此没有用户可以登录 构建 REACT 应用程序 然后