我有一个单页应用程序,可以与Dropbox和LinkedIn等其他服务集成。例如,Dropbox具有出色的API,我通过在另一个窗口中打开Dropbox的身份验证链接来获得身份验证。用户进行身份验证后,我会要求他们关闭该新窗口以返回我的应用程序。
显然这不是最理想的,因为它会让用户离开我的应用程序,而且在平板电脑上更加麻烦。
我如何在应用内进行身份验证,例如灯箱还是模式?
请注意,集成本身发生在服务器端而非客户端。目前,Dropbox身份验证页面有一个回调页面,向我的服务器发出身份验证成功的信号,我将其存储在数据库的用户表中以供将来使用。
注意:赏金评论应为:代码示例非常需要,但不是必需的。
答案 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重定向到您的页面上表示流程已完成的应用程序。
这种流程只是:
这一切都发生在一个页面内,没有关闭/打开额外的窗口。