OAuth 2.0、Android和cookies

3
如果内置的WebView浏览器没有访问默认用户浏览器的cookie权限,使用Android中的OAuth 2.0客户端授权有什么意义呢?我的意思是,如果我在WebView中打开一些oauth-url(例如http://blablabla.com/authorize?client_id=APP_ID&redirect_uri=REDIRECT_URI&response_type=token),用户将被提示输入他的凭据以登录"blablabla.com"社交网络。因为即使他已经用他的浏览器(Opera或Dolphin或默认浏览器)登录过,WebView浏览器也不知道相应的cookie信息。


编辑:

我会尝试让它更清晰一些。

主要目标是简化我的应用程序的登录流程。我想实现许多网站上都可以看到的机制:"使用...Facebook / Google / Twitter / 其他方式登录"。在桌面浏览器中,这种方法非常有效,因为最终用户已经在此浏览器中签入了目标服务。因此,要登录到我的网站,他所需要做的就是:

  1. 按下“使用...登录”按钮
  2. 在重定向的窗口/弹出窗口中点击“批准/确认”
  3. 返回并已经登录

主要好处是用户无需输入他的电子邮件/姓名/其他信息——我已经从他的社交网络帐户中提取了这些信息。

我想知道如何在Android上获得相同的效果。问题在于,据我所见,我们不能让用户避免输入密码,因为应用程序(WebView)永远不知道他是否已登录到某个外部服务。这就是为什么用户将被提示输入一些详细信息,所有OAuth的好处都将被消除的原因。


1
你正在问一个修辞问题。你实际上想知道什么? - tiguchi
1
当然有一些解决方法。 - user1370559
2个回答

2
解决方法取决于您要做什么。从您的问题中看不清楚,因为您没有解释您的用例。相反,您间接地在询问一些东西,看起来非常广泛,好像您想要维护一个跨多个应用程序使用共享 cookie 的 Android 系统范围登录状态。
出于安全原因,这既不好也不希望。恶意应用程序可以随心所欲地使用其他应用程序请求的现有访问令牌,或者干扰或读取其他应用程序中创建和维护的现有 cookie。
假设您试图授权您自己的应用程序使用 OAuth 2.0 访问 Web 服务,让用户使用 WebView 登录,您需要实现自己的 WebViewClient,覆盖其 onPageStarted 或 onPageFinished 方法,并检查 URL 参数是否与您的重定向 URL 匹配的情况。
如果匹配,则需要从 URL 字符串中提取访问令牌。如果还有可用的刷新令牌,则也要提取该令牌。
(但是,这仅适用于某种类型的 OAuth 流程,该流程将访问令牌添加到重定向 URL 中。)
现在您至少有一个访问令牌可用。将该令牌存储在应用程序的私有首选项中,并在服务请求中使用它,直到您从服务端收到401未授权错误消息。此时,如果可用,您可以使用刷新令牌请求新的访问令牌,否则您必须再次显示登录WebView。
如果您正在尝试从应用程序访问Google服务,则可能会发现文章开始使用任务API和OAuth 2.0很有用。

谢谢您的回答。我知道如何在技术上实现客户端流程。但问题是概念性的,请阅读我的编辑。 - user1370559
3
Android SDK中有AccountManager组件,可以实现您描述的操作。但是这需要在系统上安装能够验证特定账户类型的“AccountAuthenticators”。无论如何,您可以使用该组件来获取访问谷歌服务的权限。如果安装了Facebook、Twitter等应用程序,则可能也可以使用相同的方法。我的三星手机没有安装Facebook应用程序,但仍然可以在同步设置中添加Facebook帐户。我想通过AccountManager请求身份验证令牌也可能有效。 - tiguchi
好的,我想你是对的,AccountManager 是解决这个问题的唯一途径。再次感谢。 - user1370559

0
你考虑过在外部(非嵌入式)启动浏览器吗?
这样可以利用现有的 cookie,并且在用户输入凭据时给予他们最舒适的可信 UI。换句话说,用户可以看到 SSL 锁、地址栏中的正确 URL 等等。

我确实尝试过,但它也不起作用。我的意思是,我可以在外部浏览器中打开OAuth URL,但是之后我必须以某种方式返回到我的应用程序(重定向后),这很复杂:我必须拦截打开REDIRECT_URI URL的Intent - 不幸的是,在某些浏览器(如Opera)中无法正常工作。 - user1370559

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接