【问题标题】:How to authenticate users in FirefoxOS using BrowserID / Persona?如何使用 BrowserID / Persona 对 FirefoxOS 中的用户进行身份验证?
【发布时间】:2014-03-03 13:48:09
【问题描述】:

我正在尝试为我的门户编写一个 FirefoxOS 应用程序,该应用程序使用 Mozilla Persona 进行身份验证。如果我想实现,我应该如何进行:

  • 允许我的应用用户使用 Persona 注册我的门户
  • 允许我的应用用户在 FirefoxOS 应用中登录我的门户并使用 API 执行一些操作
  • 取决于用户是否登录 - 授予对不同操作的访问权限。

我发现这篇帖子包含已集成的信息:http://identity.mozilla.com/post/47114516102/persona-on-firefox-os-phones,但我找不到任何真实示例。

我需要创建什么类型的应用程序? webapp 还是特权?

我正在尝试使用常规教程来实现它:https://developer.mozilla.org/en/Persona/Quick_Setup

但是有了这段代码:

  signinLink.onclick = function() { navigator.id.request(); };

我只收到以下错误:

[17:25:18.089] Error: Permission denied to access object

【问题讨论】:

    标签: authentication authorization firefox-os browserid persona


    【解决方案1】:

    一件事是确保在调用request() 之前调用watch() 来设置回调。

    例如,您的页面中的内容如下:

    <script src="https://login.persona.org/include.js"></script>
    <script>
      window.addEventListener("DOMContentLoaded", function() {
        navigator.id.watch({
          // Provide a hint to Persona: who do you think is logged in?
          loggedInUser: null,
    
          // Called when persona provides you an identity assertion
          // after a successful request().  You *must* post the assertion
          // to your server for verification.  Never verify assertions
          // in client code.  See Step 3 in this document:
          // https://developer.mozilla.org/en/Persona/Quick_Setup
          onlogin: function(assertion) {
            // do something with assertion ...
            // Note that Persona will also call this function automatically
            // if a previously-signed-in user visits your page again.
          },
    
          onlogout: function() {
            // handle logout ...
          },
    
          onready: function() {
            // Your signal that Persona's state- and callback-management
            // business is complete.  Enable signin buttons etc.
          }
        });
    
        // Set up click handlers for your buttons
        document.getElementById("signin").addEventListener(
          'click', function() {
            navigator.id.request({
              // optional callback to request so you can respond to
              // a user canceling the sign-in flow
              oncancel: function() {  /* do something */ }
            });
          }
        });
      });
    </script>
    

    下面是一个例子,展示了这一点:

    https://people.mozilla.org/~jparsons/persona_example.html

    但是,在 FirefoxOS 上,您应该知道已安装的应用程序(未打包或认证,而是通用的已安装应用程序)具有独特的来源,格式为 app://{uuid},每个设备具有不同的 uuid。不幸的是,这对于登录目的毫无用处,因为您的服务器无法知道请求登录的应用程序是朋友还是敌人。解决此问题的方法是在服务器上托管的不可见 iframe 中运行您的角色代码。因此 iframe 将具有正确的来源,并且您的服务器将知道它是您的应用程序。 iframe 和应用可以通过 postMessage 进行通信。

    对于打包应用(有时称为特权应用),您的来源将是您的 web 应用清单中声明的​​来源。例如,app://yourapp.yoursite.org。这可以让您更好地确保该应用确实是您的,但真正偏执的人可能仍希望部署 iframe 技巧。

    希望这会有所帮助! j

    【讨论】:

    • 所以如果我理解正确 - 我应该向我的网页公开身份验证过程,从而在我的网页上运行这些 javascripts,而不是直接在设备上运行?
    • 你总是在设备上运行 watch() 和 request()。如果您没有特权应用程序,我建议运行 watch() 和 request() 的代码可以存在于从您的网页提供的 iframe 中。但第一步只是让 watch() 和 request() 在您从 FirefoxOS 或任何其他浏览器访问的网页中正常工作。这行得通吗?
    • 使用 Persona 登录我的网站,它可以工作。现在我设法让它工作 - 从移动。现在,我必须在门户中使用唱歌应用程序同步注册到移动设备 - 我可以使用 Persona 和我的应用程序登录我的网站。必须弄清楚如何传递用户已登录的信息的最佳方式。谢谢!
    • 太棒了!很高兴它正在工作。如果您遇到任何减速带,请在 #identity 频道中对 mozilla IRC 大声疾呼。干杯! j
    • 我使用来自developer.mozilla.org/ro/docs/Persona/Quick_Setup 的示例解决了其余问题,并将Persona 断言发布到我自己的网站,并且效果很好。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 2019-05-02
    • 2013-01-19
    • 2018-12-08
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多