草庐IT

javascript - 与 Web 小部件通信 - Meteor、React、Node

coder 2024-07-30 原文

我正在构建一个聊天仪表板和小部件,客户应该能够将小部件放入他们的页面中。一些类似的例子是 IntercomDrift .

目前,“主”应用程序是用 Meteor.js 编写的(它的前端是 React)。我写了一个<Widget />组件并将其放入 /widget 中目录。在这个目录中,我还有一个 index.jsx文件,其中仅包含以下内容:

import React from 'react';

import ......

ReactDOM.render(
  <Widget/>,
  document.getElementById('widget-target')
);

然后我设置一个 webpack 配置,入口点在 index.jsx当 webpack 运行时吐出一个 bundle.js在公共(public)目录中。

然后可以通过简单地包含 script 将其包含在另一个页面上和 div :

<script src="http://localhost:3000/bundle.js" type="text/javascript"></script>
<div id="widget-target"></div>

几个问题:

  1. 这个实现有什么问题?他们有什么安全问题需要注意吗?前面链接的两个示例似乎都以一种或另一种形式使用了 iframe。
  2. 与我的主要 meteor 应用程序通信的最佳方式是什么?一个 REST API?使用 Socket.io 发出事件?该小部件是一个聊天小部件,因此我需要来回发送消息。
  3. 如何为用户和小部件实现某种唯一标识符/用户身份验证?目前,小部件是预编译的。

最佳答案

1 这个实现有什么问题?他们有什么安全问题需要注意吗?前面链接的两个示例似乎都以一种或另一种形式使用了 iframe。

正如@JeremyK 提到的,您在 iFrame 中更安全。话虽如此,许多第三方(Facebook、GA 等)都在使用中间路线,包括 Intercom:

  • 要求用户将您的捆绑代码集成到他们的网页中。然后由您来确保您不会在他们的网站上引入安全漏洞。这段代码会做两件事:
  • 注意设置一个 iframe,您的服务的主要部分将在其中进行。您可以对其进行定位、设置样式等。这可确保 iframe 中发生的所有逻辑都是安全的,您不会暴露。
  • 使用窗口消息传递在您的客户网页和 iframe 之间公开一些 API。
  • 主要代码(iframe 代码)然后由第一个脚本异步加载,而不是包含在其中。

例如 Intercom 要求客户在他们的页面上包含一些脚本:https://developers.intercom.com/docs/single-page-app#section-step-1-include-intercom-js-library那很小( https://js.intercomcdn.com/shim.d97a38b5.js )。这会加载额外的代码来设置 iFrame 并公开 their API这将使与 iFrame 的交互变得容易,例如关闭它、设置用户属性等。

2 与我的主要 meteor 应用程序通信的最佳方式是什么?一个 REST API?使用 Socket.io 发出事件?该小部件是一个聊天小部件,因此我需要来回发送消息。

您有三个选择:

  • 将您的小部件构建为一个完整的 Meteor 应用程序。这将增加需要加载的代码的大小。作为额外代码的交换,您可以通过 Meteor API 与后端通信,例如 Meteor.call ,获取所有数据的 react 性(例如,如果您通过主 Meteor 应用程序向用户发送响应,只要它们在同一个数据库上,响应就会在客户端弹出,无需执行任何操作(不需要在同一台服务器上))和乐观的用户界面。简而言之,您在这里拥有 Meteor 提供的所有功能,并且它可能会更容易与我认为是 Meteor 的现有后端集成。
  • 不包括 Meteor。由于您正在构建聊天应用程序,因此您可能需要 socket.io 而不是传统的 REST API。当然,您可以将两者结合起来
  • 使用Meteor DDP . (它有点像 socket.io,但对于 Meteor。Meteor 应用程序将它用于对服务器的所有请求)这将包含比完整的 Meteor 更少的东西,并且可能比 REST API/更容易集成到你的 Meteor 后端>socket.io,并且将对完整的 Meteor 进行一些额外的工作。

3 如何为用户和小部件实现某种唯一标识符/用户身份验证?

这部分可能应该在客户网站(相对于您的 iframe)上做一些工作,以便您可以在他的页面上设置 cookie,并将该数据发送到您的 iframe,该 iframe 将与您的服务器对话并识别用户。您是否使用 artwells:accounts-guest(基于 meteor:accounts-base)将取决于您是否决定在您的 iframe 中包含 Meteor。

如果您的 iframe 中没有 Meteor,您可以执行以下操作:

  • 自己处理用户创建,只需在您的服务器上执行即可

.

const token = createToken();
Users.insert({ tokens: [token] });
// send the token back to your iframe
// and set is as a cookie on your customer website
  • 然后对于每次调用您的服务器,在您的 iframe 上:

.

let token;
const makeRequest = async (request) => {
    token = token || getCookieFromCustomerWebsite();
    // pass the token to your HTTP / socket.io / ... request.
    // in the header of whatever
    return await callServer(token, request);
};
  • 在服务器中有一个设置用户的中间件。我的看起来像:

.

const loginAs = (userId, cb) => {
  DDP._CurrentInvocation.withValue(new DDPCommon.MethodInvocation({
    isSimulation: false,
    userId,
  }), cb);
};

// my middleware that run on all API requests for a non Meteor client
export const identifyUserIfPossible = (req, res, next) => {
  const token = req.headers.authorization;
  if (!token) {
    return next();
  }
  const user = Users.findOne({ tokens: token });
  if (!user) {
    return next();
  }

  loginAs(user._id, () => {
    next();
    // Now Meteor.userId() === user._id from all calls made on that request
    // So you can do Meteor.call('someMethod') as you'd do on a full Meteor stack
  });
};

关于javascript - 与 Web 小部件通信 - Meteor、React、Node,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40967758/

有关javascript - 与 Web 小部件通信 - Meteor、React、Node的更多相关文章

  1. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  2. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  3. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  4. ruby - 如何配置 Ruby Mechanize 代理以通过 Charles Web 代理工作? - 2

    我正在使用Ruby/Mechanize编写一个“自动填写表格”应用程序。它几乎可以工作。我可以使用精彩CharlesWeb代理以查看服务器和我的Firefox浏览器之间的交换。现在我想使用Charles查看服务器和我的应用程序之间的交换。Charles在端口8888上代理。假设服务器位于https://my.host.com。.一件不起作用的事情是:@agent||=Mechanize.newdo|agent|agent.set_proxy("my.host.com",8888)end这会导致Net::HTTP::Persistent::Error:...lib/net/http/pe

  5. ruby-on-rails - Ruby 长时间运行的进程对队列事件使用react - 2

    我有一个将某些事件写入队列的Rails3应用。现在我想在服务器上创建一个服务,每x秒轮询一次队列,并按计划执行其他任务。除了创建ruby​​脚本并通过cron作业运行它之外,还有其他稳定的替代方案吗? 最佳答案 尽管启动基于Rails的持久任务是一种选择,但您可能希望查看更有序的系统,例如delayed_job或Starling管理您的工作量。我建议不要在cron中运行某些东西,因为启动整个Rails堆栈的开销可能很大。每隔几秒运行一次它是不切实际的,因为Rails上的启动时间通常为5-15秒,具体取决于您的硬件。不过,每天这样做几

  6. ruby - 在 Mechanize 中使用 JavaScript 单击链接 - 2

    我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan

  7. node.js - 如何在 Travis CI 上的一个项目中运行 Node.js 和 Ruby 测试 - 2

    我有一个包含多个组件的存储库,其中大部分是用JavaScript(Node.js)编写的,一个是用Ruby(RubyonRails)编写的。我想要一个.travis.yml文件来触发一个运行每个组件的所有测试的构建。根据thisTravisCIGoogleGroupthread,目前还没有官方支持。我的目录结构是这样的:.├──构建服务器├──核心├──扩展├──网络应用├──流浪文件├──package.json├──.travis.yml└──生成文件我希望能够运行特定版本的Ruby(2.2.2)和Node.js(0.12.2)。我已经有了一个make目标,所以maketest在每

  8. 适用于Web开发的Python还是Ruby? - 2

    Asitcurrentlystands,thisquestionisnotagoodfitforourQ&Aformat.Weexpectanswerstobesupportedbyfacts,references,orexpertise,butthisquestionwilllikelysolicitdebate,arguments,polling,orextendeddiscussion.Ifyoufeelthatthisquestioncanbeimprovedandpossiblyreopened,visitthehelpcenter提供指导。11年前关闭。我是一位精通HTML

  9. javascript - jQuery 的 jquery-1.10.2.min.map 正在触发 404(未找到) - 2

    我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文

  10. ruby-on-rails - 我将 Rails3 与 tinymce 一起使用。如何呈现用户关闭浏览器javascript然后输入xss? - 2

    我有一个用Rails3编写的站点。我的帖子模型有一个名为“内容”的文本列。在帖子面板中,html表单使用tinymce将“content”列设置为textarea字段。在首页,因为使用了tinymce,post.html.erb的代码需要用这样的原始方法来实现。.好的,现在如果我关闭浏览器javascript,这个文本区域可以在没有tinymce的情况下输入,也许用户会输入任何xss,比如alert('xss');.我的前台会显示那个警告框。我尝试sanitize(@post.content)在posts_controller中,但sanitize方法将相互过滤tinymce样式。例如

随机推荐