8

我有一个与 Dropbox 和 LinkedIn 等其他服务集成的单页应用程序。例如,Dropbox 有很好的 API,我通过在另一个窗口中打开 Dropbox 的身份验证链接来进行身份验证。用户进行身份验证后,我要求他们关闭该新窗口以返回我的应用程序。

显然,这是次优的,因为它使用户远离我的应用程序,而且在平板电脑上更加麻烦。

我将如何在应用程序中进行身份验证,例如在灯箱或模式形式中?

请注意,集成本身发生在服务器端而不是客户端。目前,Dropbox 身份验证页面有一个回调页面,向我的服务器发出身份验证成功的信号,我将其存储在数据库中的用户表中以备将来使用。

注意:赏金评论应为:非常需要代码示例,但不是必需的。

4

3 回答 3

11

你提议的是打败安全模型,所以它应该是不可能的。用户应该能够看到真实页面的 URL 以进行验证。想象一下,当您使用 Paypal 付款时,您可能会在输入重要数据之前检查您是否在 paypal.com 上?这同样适用于所有其他应用程序。这是一个非常丑陋的流程,但该行业今天提出了最好的流程。

理想的流程是您将用户重定向到第三方网站或应用程序,用户登录并授权,然后重定向回您。原生应用程序具有切换到另一个原生应用程序的好处,因此流程不那么难看。

解决这个问题的方法是让应用程序向 3rd 方服务询问用户名和密码,然后自己在幕后进行身份验证。这可能会阻止用户使用您的应用,并且非常危险。我不推荐它。

于 2012-08-31T14:00:39.037 回答
4

您可以在网页的 iframe 中加载授权端点。但是,请注意,某些浏览器在 iFrame 中对发送到登录提供程序的 cookie 有限制。通常(Safari、iOS)您只有对 cookie 的读取访问权限,如果会话 cookie 已在提供程序处设置,这就足够了。

在您的回调页面上 - 您在身份验证后从保管箱发回;您将需要调用 javascript 函数来触发父页面上的事件,即完成身份验证。

window.parent.AppController.authenticationComplete();

然后父母可以删除iframe,并继续进行身份验证。

authenticationCompleted = function() {
     // [snipp]
     $("iframe#loginwrapper").remove();
}

由于潜在的 cookie 问题,我建议您在提供主 HTML 页面之前执行从服务器端启动的所有身份验证步骤。然后,您将确保您的应用没有加载两次。这是许多身份验证/身份中间件软件解决方案的典型行为。


当您提到应用程序时,不清楚您是指纯 WebApp,还是通过使用 Phonegap 等框架在混合应用程序中提供控制。使用 Phonegap 或类似软件,您可以在应用程序内的浏览器中加载浏览器 - 在这种情况下,ChildBrowser 不受相同 cookie 限制的限制。

我最近写了一篇关于如何使用 Phonegap 和 Childbrowser for iOS 进行这项工作的教程。

请注意,本教程使用的 OAuth 2.0 与 OAuth 1.0 略有不同。

于 2012-08-29T19:17:57.427 回答
0

如果您的应用程序是 Web 应用程序,简化流程的最佳方法是将当前页面(例如,如何在 JavaScript/jQuery 中重定向到另一个网页?)重定向到 Dropbox 上的 /authorize 页面,并使用 oauth_callback 到在您的应用程序上显示该过程已完成的页面。

这样流程就是:

  1. (在您的应用程序上)用户单击按钮以启动 OAuth 流程
  2. (您的应用重定向到 Dropbox 授权页面)用户授权应用
  3. (Dropbox 将每个 oauth_callback 重定向到您的应用程序)应用程序获取访问令牌并准备好使用集成

这一切都发生在一个页面内,无需关闭/打开额外的窗口。

于 2012-07-04T19:52:51.860 回答