如何在单页面应用程序中进行Dropbox身份验证而无需打开新窗口?

时间:2012-07-04 01:29:48

标签: javascript linkedin dropbox-api singlepage

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

显然这不是最理想的,因为它会让用户离开我的应用程序,而且在平板电脑上更加麻烦。

我如何在应用内进行身份验证,例如灯箱还是模式?

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

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

3 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:4)

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

在您的回调页面上 - 您在身份验证后从Dropbox发回来的位置;你需要调用一个javascript函数来触发父页面上的事件,验证完成。

window.parent.AppController.authenticationComplete();

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

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

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


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

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

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

答案 2 :(得分:0)

如果您的应用是一个网络应用,简化流程的最佳方法是将当前页面(例如How to redirect to another webpage in JavaScript/jQuery?)重定向到Dropbox上的/ authorize页面,并将oauth_callback重定向到您的页面上表示流程已完成的应用程序。

这种流程只是:

  1. (在您的应用上)用户点击按钮启动OAuth流程
  2. (您的应用重定向到Dropbox授权页面)用户授权应用
  3. (Dropbox将每个oauth_callback重定向到您的应用)应用获取访问令牌并准备使用集成
  4. 这一切都发生在一个页面内,没有关闭/打开额外的窗口。