为 Firefox OS 构建付费应用程序

乍一看,用于 Firefox OSFirefox Marketplace 可能与 Apple Store 或 Google Play Store 类似,但有一个关键区别:它不会将你锁定在 Mozilla 或你的 Firefox OS 手机中。**它允许你出售可在任何开放式 Web 设备上运行的 Web 应用程序,通过 receipt 协议**。非 Mozilla marketplace 可以通过实现收据格式,立即参与在 Firefox OS 上销售应用程序,用户在运行来自任何商店的付费应用程序时不会注意到任何区别。

当其他设备支持 receipt 协议时,理论上你只需为应用程序支付**一次**,并在**任何地方运行它**。当然,这里存在一个先有鸡还是先有蛋的问题,因此 Mozilla 希望成为帮助证明去中心化收据概念并迭代协议的“蛋”。Mozilla 邀请其他供应商帮助我们共同努力,使收据更加完善,以便付费应用程序尽可能地便携和“Web 化”。

面向开发者

每个付费应用程序都负有 验证其自身收据 的责任。如果你是一名开发者,正在考虑在 Firefox OS 上销售你的应用程序,这篇博文可以帮助你开始实现收据验证部分。这篇博文对于想要构建兼容 Web 运行时或兼容市场的人员来说也可能很有趣。

The navigator.mozApps JavaScript API 向你的应用程序公开设备收据。验证收据的最简单方法是包含一个客户端库,如 receiptverifier.js,并使用收据中找到的托管验证服务 URL。receiptverifier 文档详细介绍了这个过程,但它与在应用程序启动时调用以下 JavaScript 代码一样简单

mozmarket.receipts.Prompter({
  storeURL: "https://marketplace.firefox.com/app/your-app",
  supportHTML: 'email you@yourapp.com',
  verify: true
});

就是这样!这是一个高级的快捷方式,如果收据丢失或无效,它还会在你的应用程序中显示一个屏幕提示。验证器文档展示了如何进行低级验证。

有关更完整的示例,你可以查看 Private Yacht 应用程序的代码,我们一直在测试中使用它。这个应用程序展示了如何使用 receiptverifier.js 库进行客户端检查,以及通过 Node.js 进行服务器端检查。我们还有一个 Python 库(以及专门针对 Django 的一个库),你可以在服务器上使用它来检查收据。

它是如何工作的?每个收据都是对 JSON Web Tokens 的混合使用。其中一个属性是链接到一个托管验证服务,你可以使用它来检查收据。你还可以选择离线验证收据,但这需要定期密钥同步,而且像退款和重新发行处理之类的某些细节对于离线验证来说还没有得到很好的支持。

默认情况下,收据只能源自应用程序 manifestinstalls_allowed_from 参数中的其中一个商店 URL。作为开发者,你将与每个市场建立明确的支付关系,因此你将希望限制谁可以声称销售你的应用程序。这充当了可以为你的应用程序提供收据的实体的白名单。由于客户端 JavaScript 的松散性质,你可以通过在服务器端(即在自己的应用程序服务器上)验证收据来更严格地控制此白名单。

Firefox Marketplace 的付费应用程序尚未完全上线,但很快就会上线。如果你现在将收据检查器集成到你的应用程序中,那么当提交流程支持付款时,你就准备好了。

欺诈保护

让 Web 上的任何人都能销售应用程序对于 Mozilla 的开放式 Web 应用程序愿景至关重要。然而,在充分保护应用程序资产(不使用 DRM)的同时使收据去中心化是一项挑战。目前,用户可以在其客户端中使用一些攻击手段,例如 DNS 代理,来访问付费应用程序,但通过 CSPCORSHSTS(仅举几例),可以减轻这种攻击。如今的付费 iOS/Android 应用程序的现状实际上与之 没有太大区别。目前有一个公开问题将帮助 使市场白名单更有效,随着越来越多的开发者和商店参与,Mozilla 预计会进一步改进该系统。切换到已签名的 打包应用程序 也可能提供另一层资产保护,但这主要是为了解决权限问题而设计的。

与往常一样,如果你遇到问题,请提交错误报告!如果这是一个 Apps 平台错误,请选择 Core(组件:DOM: Apps),或者选择 Marketplace(组件:Payments/Refunds)。

关于 Robert Nyman [编辑名誉退休]

Mozilla Hacks 的技术布道者和编辑。发表关于 HTML5、JavaScript 和开放式 Web 的演讲和博客。Robert 是 HTML5 和开放式 Web 的坚定支持者,自 1999 年起就开始从事 Web 前端开发工作,在瑞典和纽约市都有工作经历。他还定期在 http://robertnyman.com 上发表博客,喜欢旅行和结识新朋友。

更多由 Robert Nyman [编辑名誉退休] 撰写的文章……


23 条评论

  1. Steve

    我对您提到的收据格式很感兴趣,但我有一个基于 Python 的应用程序,它更侧重于服务器端,而不是面向 Firefox OS。我的应用程序可以利用收据协议并连接到您的服务,以便我以这种方式分发我的付费应用程序吗?

    2013 年 2 月 27 日 下午 09:24

    1. Kumar McMillan

      是的,当然可以。我们有一个 Python 库,你可以在服务器上使用它来验证收据(但任何人都可以在其他语言中执行类似的操作)
      https://github.com/andymckay/receipts/
      这个是针对 Django 的:https://github.com/andymckay/django-receipts/

      2013 年 2 月 27 日 下午 01:02

  2. erlehmann

    这终于可以成为 HTTP 402 付款请求的用例了吗?;)

    2013 年 2 月 27 日 上午 10:09

    1. Robert Nyman [编辑]

      也许吧。:-)

      2013 年 2 月 27 日 下午 01:52

    2. Kumar McMillan

      哈哈。是的。好吧,304 可能更有用,因为浏览器实际上会显示一个新页面来解释如何付款:)

      2013 年 2 月 27 日 下午 01:03

    3. Andy McKay

      我们现在确实使用 402 :)

      http://zamboni.readthedocs.org/en/latest/topics/api/payment.html#installing

      2013 年 4 月 4 日 上午 10:22

  3. Nikhil Somaru

    有趣。

    一个人需要具备什么样的技能组合才能开始为这个平台开发应用程序?有哪些工具?

    2013 年 2 月 27 日 上午 11:12

    1. Robert Nyman [编辑]

      一个好的起点是阅读 Open Web 应用程序入门 - 原因和方法

      2013 年 2 月 27 日 下午 01:53

  4. Jeffrey

    听起来“资产保护”只是“复制保护”和“数字版权管理”的另一种说法。是否正确?

    2013 年 2 月 27 日 下午 01:06

    1. Kumar McMillan

      当然,你可以这样认为。我们的意思是,Mozilla 不提供完整的数字版权管理。你可以防止人们在未付费的情况下使用你的付费应用程序,但永远无法做到 100% 有效。我们不会使用真正的 DRM 在 Web 上加密资产。

      虽然这可能让一些企业感到失望,但我们的计划是让为应用程序*付费*变得非常容易,比窃取它们更容易;)

      2013 年 2 月 28 日 上午 08:42

      1. ZenCODE

        谢谢,这澄清了很多问题 ;-)

        2013 年 3 月 17 日 上午 02:02

  5. pnathan

    我四处查看,但没有看到有关应用内购买的内容。我对探索这个功能非常感兴趣。

    是我漏掉了,还是还没有这项功能呢?

    此致,
    pnathan

    2013年2月27日 下午2:16

    1. Robert Nyman [编辑]

      将支持应用内支付,但需要解决一些相关细节问题(我们希望在这里发布一篇后续文章)。

      一般来说,它看起来像这样

      var pay = navigator.mozPay(paymentToken);
      pay.onsuccess = function (event) {
      // 支付成功
      }

      2013年2月27日 下午5:25

  6. Kostadinov

    Robert,
    是否可以将手机连接到电脑,直接修改手机上任何应用程序的源代码?
    例如,如果我想更改主页面背景颜色,或者在某个地方添加一个自定义的div,这是否足够容易呢?

    2013年2月28日 中午12:42

    1. Robert Nyman [编辑]

      好问题!如果你对这个感兴趣,我建议你阅读这篇文章:为 Firefox OS 攻克 Gaia,第一部分

      2013年3月1日 上午7:56

      1. Kostadinov

        谢谢,Robert!我已经查看了这篇文章和其他许多链接。我对这个系统感到很舒服,并且确信我可以为自己的需求编写一些应用程序。
        我的问题稍微偏向另一个方向——应用程序的安全性(从代码保护的角度来看)。例如,如果所有内容都容易可见和访问,那么就有可能出现这种情况:我为一个应用程序付费,然后将手机连接到电脑,将应用程序复制到电脑上,然后将其部署到另一部手机上。
        我知道在开放内容(代码)和受保护内容之间取得平衡是一项艰巨的任务,这就是为什么我对 FFOS 的方法感到好奇的原因。它会比 iOS 好得多,但我们需要弄清楚权衡取舍是什么。

        2013年3月1日 下午1:25

        1. Kumar McMillan

          好问题。你可以复制自己的收据,它在所有设备上都是有效的。因此,如果你的有效收据泄露,任何其他人也可以使用它(收据没有与用户绑定)。为了防止这种滥用,应用程序可以在服务器端进行收据检查,如果同一个收据同时被 5 个以上 IP 访问,则阻止使用。攻击者无法从你的手机中获取收据,除非先对手机进行物理上的破解。

          2013年3月1日 下午1:29

          1. Korni

            我刚刚从官方市场安装了一个免费应用程序,将手机连接到我的电脑,然后能够浏览该应用程序的代码。只需稍微查找,我就在 “/data/local/webapps/webapps.json” 中找到了所有重要的信息,例如应用程序的来源。然后,你只需打开你喜欢的浏览器,访问该网站,查看整个源代码……这正是我对 Firefox OS 的担心。你开发了一个很棒的应用程序,通过市场出售,然后有人只是复制它,以半价出售。这不是要破解你的应用程序,而是要窃取代码,这可能会让一些开发者望而却步。除非有保护代码的解决方案。对于 iOS 和 Android,我们有原生应用程序,因此不需要代码保护。这里需要其他东西……

            2013年3月12日 上午7:47

          2. Kumar McMillan

            嗨,Korni。你说的是对的:你可以查看任何应用程序的源代码,因为它属于 Web,而这就是 Web 的本质。即使是打包应用程序,你也可以破解设备并检索包。但是,你提到你无法在 iOS 和 Android 上这样做,但事实并非如此。尝试在 Google 上搜索你最喜欢的付费 Android 应用程序的 apk 文件,你可能会找到它。反编译 Java 代码并不难(尝试搜索),结果与反编译混淆的 JavaScript 不会有太大区别。另一方面,iOS 会剥离符号,因此无法始终获取源代码。

            无论如何,我认为 Web 上的付费应用程序不会比 iOS/Android 应用程序更容易获得。在 *两种* 情况下,都需要在付费应用程序中放入一个强大的服务器组件,才能使其真正独一无二,无法被盗版。即使这样,如果应用程序成功,总有人会试图复制它。例如,看看中国第一个 Groupon 克隆,风格 *和* 服务器逻辑在短时间内就被复制了。

            2013年3月13日 上午7:28

  7. WebResourcer

    采用收据协议的有趣方法。我喜欢你只需要为一个应用程序付费就可以在任何地方运行它的想法。希望其他人能采用这种方法,这将统一很多事情。

    2013年3月2日 上午9:50

  8. Rogger Shaw

    这就像资产保护。复制保护和数字版权管理的另一种说法。

    我说的对吗?

    2013年3月4日 上午3:14

  9. Fred Lin

    收据协议是否支持 Web 应用程序侧面的多个 Web 市场?

    作为一名 Web 应用程序开发者,我可能希望将我的 Web 应用程序同时放在运营商的市场和 Mozilla 市场中。

    2013年3月5日 上午7:32

    1. Kumar McMillan

      是的,这就是它的设计目的。作为开发者,你可以通过任何支持收据协议的市场出售你的应用程序。

      2013年3月5日 上午8:54

本文的评论已关闭。