2012-08-06 78 views
4

我一直在为我的公司开发和维护一个Chrome扩展程序,其中每位客户都会在代码中分配一个唯一的ID。我们一直在使用该ID来确定许可证状态并登录我们的服务(按月收费收费的延期付款)。Chrome网上应用店的扩展程序的用户特定版本

到目前为止,我们自己托管了扩展文件,并为每个客户扩展都有独特的更新URL。这很好,很简单;去我们的网站,点击安装,你就完成了。然而,在最新的Chrome版本中,Google的这一安装过程受到阻碍,因为他们现在要求用户通过将CRX文件拖放到chrome:// chrome/extensions/tab来安装扩展。当然,除非你的扩展,可通过Chrome网上应用店 - 这使我的问题:

  • 我们不想拖放CRX安装 - 需要网上商店。
  • 我们不希望Web Store上的扩展的多个版本(每个客户一个),因为每次我们更新扩展时,这都是一个维护地狱。
  • 我们不想使用网上应用店授权,因为:
    • 它需要OpenID登录。
    • 我们向许多学生出售学校支付学费的扩展 - 而不是学生。
    • 我们不希望将我们的付款方式锁定到一个浏览器,即我们希望能够通过我们或服务器维持许可和付款。
  • 我们不希望用户输入许可证密钥,因为数千名学生不得不输入密钥的风险太大 - 还需要某种存储器(cookies/localStorage)被清除,需要再次输入许可证密钥。

我不是100%肯定,我的发言是完全正确的,所以不吝赐教我,如果我错过了什么。

如果是这样,问题是我们是否可以通过Web商店(使用唯一ID)为每个客户定制扩展程序,而无需为每个ID发布一个扩展?

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

+0

关于localStorage:您的应用程序的localStorage不会被清除,除非您的应用程序执行此操作(您将知道发生了什么并且可以正确处理它),或者您的用户从JS控制台执行它(在这种情况下他会知道它打破了,因为他在JS控制台上瞎忙)。应用程序localStorage永远不会被浏览器任意清除 - 即使用户擦除了所有localStorage(https://code.google.com/p/chromium/issues/detail?id=36550)(请注意链接的bug被标记为“WontFix”)。然而,数千名学生输入许可证密钥是另一个问题。 – apsillers 2012-08-06 13:35:55

回答

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 有效的相应签名。当然,这并不会阻止那些合法访问有效链接的人将链接分享给未经授权的人,但我认为这是旧系统中存在的一个漏洞。

+0

我建议在'localStorage'上使用['chrome.storage.sync'](http://code.google.com/chrome/extensions/storage.html#property-sync),因为它允许用户使用使用Google同步时,多台计算机拥有相同的凭据。 – 2012-08-06 14:28:49

+0

我的老板批准这种方法。出于好奇,你会如何避免将扩展与共享激活链接一样简单? – Woodgnome 2012-08-07 10:25:55

+0

我能想到的唯一真正的安全选项是用户在登录页面(例如'enterpass.php?custid = ...')输入的机构范围用户名/密码:1)HTTP身份验证或2)然后用作为POST数据传递给激活页面的用户名和密码重定向到'activateapp.php'。在#2下,如果POST数据是正确的,'activateapp.php'只会返回'200 OK'响应,除了检查有效的'custid'。 – apsillers 2012-08-07 12:28:32

相关问题