4

我一直在为我的公司开发和维护一个 Chrome 扩展程序,每个客户都将在代码中被分配一个唯一的 ID。我们一直在使用 ID 来确定许可证状态并登录我们的服务(按月付费的付费延期)。

到目前为止,我们自己托管了扩展文件,并为每个客户扩展提供了唯一的更新 URL。这很好很简单;转到我们的网站,单击安装,您就完成了。然而,在最新的 Chrome 版本中,该安装过程已被 Google 阻止,因为他们现在要求用户通过将 CRX 文件拖放到 chrome://chrome/extensions/ 选项卡中来安装扩展程序。当然,除非您的扩展程序可以通过 Chrome 网上应用店获得 - 这导致了我的问题:

  • 我们不希望拖放式 CRX 安装 - 需要 Web Store。
  • 我们不希望 Web Store 上有多个版本的扩展(每个客户一个),因为每次我们更新扩展时,这都是一个维护地狱。
  • 我们不想使用网上应用店许可,因为:
    • 它需要 OpenID 登录。
    • 我们将延期出售给有许多学生的学校,由学校支付账单 - 而不是学生。
    • 我们不想将我们的支付方式锁定在一个浏览器上,即我们希望能够通过我们的或服务器来维持许可和支付。
  • 我们不希望用户输入许可证密钥,因为这对于数千名学生必须输入密钥的风险太大 - 而且它需要某种存储(cookies/localStorage),最终会被清除,需要许可证密钥重新输入。

我不能 100% 确定我的陈述是完全正确的,所以如果我遗漏了什么,请随时启发我。

如果是,那么问题是我们是否可以通过 Web Store(使用唯一 ID)为每个客户定制扩展,而不需要为每个 ID 发布一个扩展?

作为一个附带问题,任何可能用另一种方法解决问题的答案也将被接受。

4

1 回答 1

2

对于下面的答案,我假设您的应用是打包应用,而不是托管应用。

我有一个与您当前的实现非常相似的解决方案,但为用户增加了一个额外的步骤。对于学生用户,该过程将如下所示:

  1. 从网上应用店下载应用程序。该应用程序尚未运行,启动它只会显示“请单击您的学校/机构提供的激活链接”消息。
  2. 单击托管在您的服务器(即您用来托管更新 URL 的服务器)上的链接,该链接看起来像https://myserver.com/activateapp.php?custid=123456789. 您为您支持的每个机构托管一个此类链接,并且该机构的工作是向其学生提供链接。此链接激活应用程序。

从实现的角度来看,它是这样工作的:

  1. https://myserver.com/activateapp.php在您的服务器上托管一个页面。服务器端,检查custid参数是否有效。如果不是,则发送 404 错误。
  2. 您的应用程序有一个内容脚本被注入https://myserver.com/activateapp.php,它会扫描 URL 并挑选出客户 ID。应用程序找到 ID 后,会将其存储在 localStorage 中。由于无效的客户 ID 会产生 404 错误,因此您知道当内容脚本运行时,页面不是 404 错误;因此,它正在读取有效的客户 ID。
  3. 每当应用程序想要查询您的服务时,它都会检查它在 localStorage 中是否有客户 ID。如果是,则使用该 ID;如果没有,它会显示一条消息,表明应用程序尚未激活。打包的应用程序永远不会localStorage被删除,除非您的应用程序被编程为擦除自己的存储空间,或者用户从控制台执行此操作。存储擦除永远不会“意外”发生。即使是最强大的浏览器范围的数据/缓存清除也只会localStorage从网页中清除,而不是从应用程序和扩展程序中清除。

为了额外的安全性——如果你不希望人们随机猜测客户 ID——你可以添加一个额外的签名参数,比如https://myserver.com/activateapp.php?custid=123456789&sig=2464509243. 这个额外的参数是客户 ID 的一些服务器验证转换(理想情况下是加密签名或与数据库中的 ID 关联的纯随机值),任何人都无法猜测。当请求activateapp.php到达服务器时,它会检查有效的客户 ID有效的相应签名。当然,这并不能阻止对有效链接具有合法访问权限的人将链接共享给未经授权的人,但我希望这是您的旧系统中存在的漏洞。

于 2012-08-06T14:08:39.877 回答